#!/usr/bin/perl
while(<>) {
@F = split; # split input line into array @F using whitespace as separator.
# Note: perl arrays start from 0, not 1.
print if (($F[2] eq 'tcp') &&
($F[3] eq '10.11.38.224') &&
($F[5] eq '10.185.34.240') &&
($F[8] == 9012))
}
(que if
declaração poderia ser tudo em uma linha, mas é muito mais fácil de ler formatado como este)
Guarde isto em, por exemplo myscript.pl
, torne executável com chmod +x myscript.pl
e execute como:
$ ./myscript.pl file1.txt
access firewall tcp 10.11.38.224 255.233.212.111 10.185.34.240 244.255.240.211 eq 9012
Este programa não é muito útil, no entanto. Realmente só faz uma coisa, imprimir linhas combinando exatamente com os quatro critérios de busca.
Nota: como regra geral, para programas como este, é melhor escrevê-los como um filtro - isto é, obter entrada de stdin e / ou qualquer nome de arquivo mencionado na linha de comando do que codificar um nome de arquivo específico no arquivo. programa.
Dessa forma, ele pode ser usado com qualquer nome de arquivo ou pode receber dados de grep
ou awk
ou alguma outra saída do programa.
O identificador de arquivo <>
no perl faz exatamente isso. Ele pegará a entrada de nomes de arquivos stdin AND (se houver) dados como argumentos na linha de comandos.
while (<>) { ...code... }
é algo que você verá muito em programas perl que pesquisam, reformatam, extraem dados e fazem outras coisas para stdin e / ou entrada de arquivos.
com base na sua pergunta semelhante de ontem, se você quiser variáveis com nomes significativos em vez de apenas uma matriz @F
, você pode escrever assim:
#!/usr/bin/perl
while(<>) {
my ($access, $something, $proto, $srcIP, $srcmask,
$destIP, $destmask, $eq, $port) = split;
print if (($proto eq 'tcp') &&
($srcIP eq '10.11.38.224') &&
($destIP eq '10.185.34.240') &&
($port == 9012))
}
e você pode usar undef
para qualquer campo com o qual não se preocupe e não pretenda usar. por exemplo,
my (undef, undef, $proto, $srcIP, undef, $destIP, undef, undef, $port) = split;
BTW, algo assim poderia ser feito facilmente em awk
também:
$ awk '$3=="tcp" && $4=="10.11.38.224" && $6=="10.185.34.240" && $9==9012' file1.txt
access firewall 1 10.11.38.224 255.233.212.111 1 244.255.240.211 eq 9012
ou como um perl one-liner:
$ perl -lane 'print if $F[2] eq "tcp" && $F[3] eq "10.11.38.224" && $F[5] eq "10.185.34.240" && $F[8] == 9012' file1.txt
access firewall tcp 10.11.38.224 255.233.212.111 10.185.34.240 244.255.240.211 eq 9012