Não tenho muita certeza do que você deseja analisar, pois ainda não vi o formato de entrada, mas, se você quiser apenas ler uma lista de IPs e imprimir no arquivo de saída correspondente, tente:
awk 'NR==FNR{a[$1]=NR; next} {
for(ip in a){
if($0~ip){
print >> "line_"a[ip]"_ip.txt"
}
}
}}' <(wget -O - "https://zeustracker.abuse.ch/blocklist.php?download=badips" 2>/dev/null |
grep -Ev "#|^ *$") http.log
Isso é um pouco complexo, então vamos dividi-lo:
-
wget -O - https://zeustracker.abuse.ch/blocklist.php?download=badips 2>/dev/null | grep -Ev "#|^ *$"
: isso fará o download da lista de IPs, removerá qualquer linha que contenha#
ou esteja vazia e imprima na saída padrão. -
<(command)
: Isso é chamado de substituição de processo e é um truque que algumas conchas (bash, zsh e ksh, mas talvez outros também) têm o que permite tratar a saída de um processo como um arquivo de entrada para outro comando. - Portanto, o
awk
snipet vê dois "arquivos", o primeiro é a saída do comandowget
canalizado através degrep
e o segundo é o arquivohttp.log
. -
NR==FNR{a[$1]=NR; next}
: NR é o número da linha de entrada atual eFNR
é o mesmo, mas o arquivo atual . Os dois serão iguais apenas enquanto o primeiro arquivo estiver sendo lido. Isto irá, portanto, criar a matriza
cujas chaves são os IPs e cujo valor é o número da linha atual. -
for(ip in a)
: iterar sobre a matriza
, salvando cada uma de suas chaves (os IPs) comoip
. -
if($0~ip){}
: se essa linha ($0
) corresponder a esseip
. -
print >> "line_"a[ip]"_ip.txt"
: imprime a linha em um arquivo chamadoline_
, o número da linha de entrada em que esse IP foi visto e_ip.txt
. O>>
garante que o arquivo seja anexado e não seja sobrescrito.