Com awk
, é muito melhor fornecer o nome do arquivo como argumento da linha de comando, se for algo simples, como procurar por correspondências e quais linhas contêm a correspondência. Em puro awk isso seria algo assim
awk '/searchTerm/ {print "Match on " NR }' inputFile.txt
Mas, com certeza, seu programa pode ser ligeiramente editado e transformado em script AWK para fazer o mesmo trabalho, porém com mais linhas de código. A única pequena peculiaridade é que é preciso pressionar Ctrl + D para parar o loop while, uma vez que o arquivo esteja pronto para leitura.
#!/usr/bin/awk -f
BEGIN{
printf("What do we search for:")
getline searchTerm
printf("Enter filename : ")
getline file < "-"
print "File Contents:"
while((getline < file)) {
x++
printf("%d) %s\n",x,$0)
if ($0 ~ searchTerm) {i++;array[i] = x}
}
# end while statement
}
END{
print "There were "i" matches on lines:"
for (j=1;j<=i;j++) printf array[j]" ";
}
Abaixo, você encontrará a demonstração. Compare o código "traduzido" acima, com o AWK puro:
xieerqi:$ ./testAwk.awk
What do we search for:wlan0
Enter filename : inputFile.txt
File Contents:
1) [33330.084088] wlan0: associate with 00:24:37:10:9c:10 (try 1/3)
2) [33330.086392] wlan0: RX AssocResp from 00:24:37:10:9c:10 (capab=0x411 status=0 aid=1)
3) [33330.086432] wlan0: associated
4) [40272.298739] audit: type=1400 audit(1447859037.270:65): apparmor="STATUS" operation="profile_replace" name="/usr/lib/cups/backend/cups-pdf" pid=4082 comm="apparmor_parser"
5) [40272.298753] audit: type=1400 audit(1447859037.270:66): apparmor="STATUS" operation="profile_replace" name="/usr/sbin/cupsd" pid=4082 comm="apparmor_parser"
6) [40272.299725] audit: type=1400 audit(1447859037.270:67): apparmor="STATUS" operation="profile_replace" name="/usr/sbin/cupsd" pid=4082 comm="apparmor_parser"
7) [59169.780814] atkbd serio0: Unknown key pressed (translated set 2, code 0xa5 on isa0060/serio0).
8) [59169.780823] atkbd serio0: Use 'setkeycodes e025 <keycode>' to make it known.
9) [59169.783874] atkbd serio0: Unknown key released (translated set 2, code 0xa5 on isa0060/serio0).
10) [59169.783882] atkbd serio0: Use 'setkeycodes e025 <keycode>' to make it known.
There were 3 matches on lines:
1 2 3
xieerqi:$ awk '/wlan0/{print "Match on " NR }' inputFile.txt
Match on 1
Match on 2
Match on 3