Il y a un script (appelons-le echoer
) qui imprime pour filtrer un tas d'informations. J'aimerais pouvoir voir uniquement les lignes après avoir trouvé un motif.
J'imagine l'utilisation d'une solution pour ressembler à quelque chose
echoer | solution_command <pattern>
Idéalement, ce pattern
serait une expression régulière, mais des chaînes de valeur dures seraient suffisantes pour moi.
Réponses:
AWK peut le faire avec des plages de modèles, ce qui permet d'utiliser n'importe quelle expression régulière:
imprimera
echoer
la sortie en commençant par la première ligne correspondantepattern
.AWK est basé sur un modèle et est généralement utilisé avec une approche «si ce modèle correspond, faites cela». «Ce modèle» peut être une gamme de modèles, définie comme «lorsque ce modèle correspond, commencez à le faire, jusqu'à ce que cet autre modèle corresponde»; ceci est spécifié en écrivant deux modèles séparés par une virgule, comme ci-dessus. Les modèles peuvent être des correspondances de texte, comme dans
/pattern/
, où la ligne actuelle est vérifiée par rapport au modèle, interprétée comme une expression régulière; elles peuvent également être des expressions générales, évaluées pour chaque ligne et considérées comme identiques si leur résultat est non nul ou non vide.Dans AWK, l'action par défaut consiste à imprimer la ligne actuelle.
En rassemblant tout cela, il
awk '/pattern/,0'
recherche les lignes correspondantespattern
et une fois qu'il en trouve une, il applique l'action par défaut à toutes les lignes jusqu'à ce que la0
condition corresponde (non différente de zéro).awk '/pattern/,""'
fonctionnerait aussi.Le manuel de Gawk est beaucoup plus détaillé.
la source
0
? Serait-ce/pattern/,/0/
? À quoi ressemblerait la réponse en écrivant explicitement l'action par défaut?/pattern/,/0/
s'imprime jusqu'à ce qu'il trouve une ligne (enregistrement) contenant "0". L'écriture de l'extrait dans la réponse avec une action explicite donne/pattern/,0 { print $0 }
, ou de manière équivalente/pattern/,0 { print }
.L'
sed
équivalent obligatoire de celui de @ StephenKittawk
:pattern
il est interprété comme une expression régulière de base comme dansgrep
(par opposition à l' expression régulière étendue dansawk
/egrep
/grep -E
). Certainessed
implémentations ont une option-E
(BSD, ast, GNU / busybox récente, bientôt POSIX) ou-r
(GNU, ssed, busybox, certains BSD récents) pour en faire des expressions régulières étendues à la place et d'autres ont-P
(ast) ou-R
(ssed) pour le faire une expression régulière de type perl.Avec
perl
:la source
avec GNU et * BSD grep:
À moins que votre fichier ne comporte plus de 1 million de lignes, c'est tout.
la source
Si vous utilisez un téléavertisseur
less
pour afficher la sortie de la commandela source
awk
pour les lignes après (mais sans inclure) la première correspondance de motifSi la ligne contenant le motif de déclenchement est l'équivalent de "COUPER ICI", vous pouvez l'omettre de la sortie imprimée:
Chaque ligne d'entrée passe par deux composants dans le code awk. Le premier composant est
flag
, ce que awk interprète comme "affiche la ligne si la variableflag
n'est pas nulle". Puisque les variables awk sont 0 par défaut, cela n'imprimera initialement rien.Le deuxième composant
/pattern/ { flag=1 }
,, définit l'indicateur à 1 dès qu'il détecte le modèle, et l'indicateur conserve cette valeur pour le reste de l'analyse.Au moment où le motif est détecté pour la première fois, la possibilité d'imprimer cette ligne d'entrée est passée. Toutes les lignes suivantes (y compris les lignes supplémentaires contenant le motif) s'impriment.
la source
Frapper
Un peu maladroit, mais ça marche.
Cette version repose sur
cat
, mais elle est plus facile à comprendre.la source