Imprimer les lignes entre PAT1 et PAT2
$ awk '/PAT1/,/PAT2/' file
PAT1
3 - first block
4
PAT2
PAT1
7 - second block
PAT2
PAT1
10 - third block
Ou, à l'aide de variables:
awk '/PAT1/{flag=1} flag; /PAT2/{flag=0}' file
Comment cela fonctionne?
-
/PAT1/
correspond lignes de ce texte, ainsi que d' /PAT2/
n'.
-
/PAT1/{flag=1}
jeux de l' flag
lorsque le texte PAT1
se trouve dans une ligne.
-
/PAT2/{flag=0}
unsets l' flag
lorsque le texte PAT2
se trouve dans une ligne.
-
flag
est un modèle à l'action par défaut, qui est de print $0
: si flag
est égal à 1, la ligne est imprimée. De cette façon, il aura l'impression de toutes ces lignes du temps PAT1
se produit et jusqu'à la prochaine PAT2
est observée. Cela permettra également d'imprimer les lignes du dernier match de l' PAT1
jusqu'à la fin du fichier.
Imprimer les lignes entre PAT1 et PAT2 - non compris PAT1 et PAT2
$ awk '/PAT1/{flag=1; next} /PAT2/{flag=0} flag' file
3 - first block
4
7 - second block
10 - third block
Il utilise next
de sauter de la ligne qui contient PAT1
afin d'éviter d'être imprimé.
Cet appel à l' next
peut être supprimé par remaniement blocs: awk '/PAT2/{flag=0} flag; /PAT1/{flag=1}' file
.
Imprimer les lignes entre PAT1 et PAT2 - y compris PAT1
$ awk '/PAT1/{flag=1} /PAT2/{flag=0} flag' file
PAT1
3 - first block
4
PAT1
7 - second block
PAT1
10 - third block
En plaçant flag
à la fin, il déclenche l'action qui a été mis sur PAT1 ou PAT2: pour imprimer sur PAT1, de ne pas imprimer sur PAT2.
Imprimer les lignes entre PAT1 et PAT2 - y compris PAT2
$ awk 'flag; /PAT1/{flag=1} /PAT2/{flag=0}' file
3 - first block
4
PAT2
7 - second block
PAT2
10 - third block
En plaçant flag
au tout début, il déclenche l'action qui a été défini précédemment, et donc d'imprimer la clôture motif, mais pas le début.
Imprimer les lignes entre PAT1 et PAT2 - à l'exclusion des lignes à partir de la dernière PAT1 à la fin du fichier si aucun autre PAT2 se produit
Ceci est basé sur une solution par Ed Morton.
awk 'flag{
if (/PAT2/)
{printf "%s", buf; flag=0; buf=""}
else
buf = buf $0 ORS
}
/PAT1/ {flag=1}' file
Comme un one-liner:
$ awk 'flag{ if (/PAT2/){printf "%s", buf; flag=0; buf=""} else buf = buf $0 ORS}; /PAT1/{flag=1}' file
3 - first block
4
7 - second block
# note the lack of third block, since no other PAT2 happens after it
Cela permet de maintenir toutes les lignes sélectionnées dans un tampon qui est renseigné à partir du moment où PAT1 est trouvé. Ensuite, il continue à être rempli avec les lignes suivantes jusqu'à ce que PAT2 est trouvé. Dans ce point, il imprime le contenu stocké et vide la mémoire tampon.