GUIDA AD AWK, 06 – ricerca pattern

Cercare un pattern in un file, nell’intera riga o in una colonna

 

Simulazione di grep:

$ awk '$0 ~ /pippo/{print}' file7
pippo 50

~ = contiene

Di default awk cerca sull’intera riga, quindi si può omettere “$0″:

$ awk '/pippo/{print}' file7

E siccome di default stampa l’intera riga, il tutto si riduce in:

$ awk '/pippo/' file7

Se vogliamo che il pattern matchi solo con la prima colonna e stampi l’intera riga:

$ awk '$1 ~ /pippo/' file7

Se in file7 nella prima colonna ci sarà sia “pippo” che “pippos” il risultato sarà:

$ awk '$1 ~ /pippo/' file7
pippo 50
pippos 60

Quindi se vogliamo che il match sia sulla parola esatta, anzichè utilizzare la sintassi “$1 ~ / …” potremo digitare:

$ awk '($1=="pippos") {print}' file7
oppure
$ awk '($1=="pippos")' file7
o ancora meglio:
$ awk '$1=="pippos"' file7

Riassumendo:
$ awk ‘/pippo/’ file7 -> cerca le parole uguali a o che contengano “pippo” nel file file7 e stampa la riga
$ awk ‘$1==”pippo”‘ file7 -> cerca le parole che coincidano perfettamente con pippo in file7 e stampa la riga

Con l’operatore OR (|) possiamo richiedere il match con più parole:

$ awk '/pippo|pluto/' file7
pippo 50
pluto 100
pippos 60
plutos 110

Se cerchiamo solo il match nella prima colonna:

$ awk '($1 ~ /pluto|pippo/)' file7

Se poi il match deve essere esatto uso gli indicatori ^ (inizio riga) e $ di fine riga:

$ awk '($1 ~ /^pluto$|^pippo$/)' file7

Pattern mismatch:

$ awk '!/pippo/' file7
$ awk '$1 !~ /pluto$/' file7

Ora vogliamo stampare i records in cui il secondo campo contiene un valore superiore o uguale a 160:

$ awk '$2>=160' file7

Per stampare il record contenente pippo ma solo se è il primo record:

$ awk 'NR==1 && /pippo/' file7

Per stampare il numero dei record contenenti la stringa “pippo”:

$ awk '/pippo/ {print NR}' file7
1
5

Ora vogliamo stampare i record contenenti il pattern “pluto” e aventi un valore nella seconda colonna superiore a 90:

$ awk '/pluto/ && $2>90' file7
pluto 100
plutos 110

&& = AND -> deve essere soddisfatta sia la prima che la seconda condizione
Diverso l’operatore:
|| = OR -> deve essere soddisfatta o la prima o la seconda condizione

Stampare i records con valore superiore a 90 o contenenti la stringa pippo:

$ awk '/pluto/ || $2>90' file7
pluto 100
paperino 150
minnie 200
plutos 110
paperinos 160
minnies 210

————————————

INDICE

Lascia una risposta

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>