Comment imprimer 5 lignes consécutives d'après un modèle dans le fichier à l'aide de awk
Je voudrais pour rechercher un motif dans un fichier et l'imprime 5 lignes après avoir constaté que modèle.
J'ai besoin d'utiliser awk
pour ce faire.
Exemple:
Le Contenu Du Fichier:
.
.
.
.
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
.
.
.
Comment puis-je analyser par le biais d'un fichier et d'imprimer uniquement les lignes mentionnées ci-dessus?
Puis-je utiliser le N ° de la ligne qui contient "MODÈLE" et de garder en incrémentant jusqu'à 5 et imprimer chaque ligne dans le processus.
Veuillez ne laissez-moi savoir si il y a d'autres efficace wat faire en Awk.
Vous devez vous connecter pour publier un commentaire.
Une autre façon de faire dans AWK:
dans
sed
:dans GNU
sed
:ou
La
#
caractères représentent un compteur. Utiliser soit un de moins que le nombre de lignes que vous voulez de sortie./PATTERN/,+5p' file
peut adapter le projet de loi. Oused -n /PATTERN/{N;N;N;N;N;p}' file
.awk
réponse est beaucoup plus flexible, de sorte qu'il est plus utile que la version compacte qui sont agréable sur leur propre et le point de la question. Mais je pourrais faire beaucoup plus à partir de cette syntaxe particulière: trouver modèle, imprimer deux lignes suivantes et de les combiner en une seule ligne, avec des conditions d'impression (champs) pour chacun d'eux.;
aprèsp
, c'est à dire,sed -n '/PATTERN/{n;p;n;p;n;p;n;p;n;p;}'
inputfile, ou comme @potong dit,sed -n '/regex/{N;N;N;N;N;p;}'
fichier.Cela donne:
$NF ~ /PATTERN/ {
?/PATTERN/ &&
!grep "PATTERN" search-file -A 5
fera le travail pour vous si vous décidez de donner grep une chance.Edit: Vous pouvez appeler à l'aide de grep
system()
fonction à partir de l'intérieur de votreawk
le script.grep
dansawk
? Beurk!grep -A5 | tail -5
? GNUgrep
2.14 ici.PATTERN
,grep -A5
résultat sera le même résultat que votre code. Cependant, les choses se compliquent avec plusieurs occurences.awk
à la rescousse!à imprimer avec le motif de la ligne (au total, 6 lignes)
de saut et d'imprimer les cinq prochaines lignes
awk 'c&&c--; /^####PATTERN/{c=5}'
. Peut-on écrire n'importe quel type de déclaration avant modèle comme l'impression ou la cession etc ?{print}
.Edit: n'ai pas d'avis
PATTERN
ne devrait pas être partie de la sortie.ou
Le plus court que je peux venir avec est:
Lire comme un tend vers 0. /qmaild/jeux de un à 5 🙂
-->
opérateur de! Mais pourquoi êtes-vous à l'aide decat
?Rapide&solution sale:
awk '/PATTERN/{i=0} { if (i<=5) {print $0}; i+=1} BEGIN {i=6}'
Aussi limitée que Johnsyweb de la solution, mais en utilisant une approche différente et GNU
awk
's de fonctionnalités avancées permettant une RegEx séparateurs d'enregistrements résultant dans un morceau de code qui, à mon humble avis, est trèsawk
-ish:Donc, si vous voulez une solution stable, qui est également lisible, aller de pair avec Dennis Williamson réponse (+1 pour ça), mais peut-être que vous aussi tout simplement profiter de la beauté de
awk
quand on regarde les lignes comme ceci.