grep un fichier, mais montre plusieurs lignes environnantes?

Je voudrais grep pour une chaîne, mais aussi montrer les cinq lignes précédentes et les cinq lignes suivantes ainsi que la ligne correspondante. Comment pourrais-je le faire?

Pour BSD ou GNU grep vous pouvez utiliser -B num pour définir le nombre de lignes avant la correspondance et -A num pour le nombre de lignes après la correspondance.

 grep -B 3 -A 2 foo README.txt 

Si vous voulez le même nombre de lignes avant et après, vous pouvez utiliser -C num .

 grep -C 3 foo README.txt 

Cela montrera 3 lignes avant et 3 lignes après.

-A et -B fonctionneront, de même que -C n (pour n lignes de contexte), ou juste -n (pour n lignes de contexte).

ack fonctionne avec des arguments similaires à grep et accepte -C . Mais il est généralement préférable de chercher dans le code.

 grep assortingng myfile -A 5 -B 5 

Cela va grep “myfile” pour “assortingng”, et affichera 5 lignes avant et après chaque match

J’utilise normalement

 grep searchssortingng file -C n # n for number of lines of context up and down 

De nombreux outils tels que grep ont aussi de très bons fichiers man. Je me trouve souvent en train de faire référence à la page de manuel de grep car il y a tellement de choses que vous pouvez en faire.

 man grep 

De nombreux outils GNU ont également une page d’informations pouvant contenir des informations plus utiles en plus de la page de manuel.

 info grep 

Recherchez “17655” dans “/some/file.txt” en affichant le contexte 10 lignes avant et après (en utilisant Awk), la sortie précédée du numéro de ligne suivi de deux points. Utilisez-le sous Solaris lorsque «grep» ne prend pas en charge les options «- [ACB]».

 awk ' /17655/ { for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) { print before[i] } print (NR ":" ($0)) a = 10 } a-- > 0 { print (NR ":" ($0)) } { before[b] = (NR ":" ($0)) b = (b + 1) % 10 }' /some/file.txt; 

Utilisez grep

 $ grep --help | grep -i context Context control: -B, --before-context=NUM print NUM lines of leading context -A, --after-context=NUM print NUM lines of trailing context -C, --context=NUM print NUM lines of output context -NUM same as --context=NUM 

ripgrep

Si vous vous souciez des performances, utilisez ripgrep qui a une syntaxe similaire à grep , par exemple

 rg -C5 "pattern" . 

-C , --context NUM – Affiche les lignes NUM avant et après chaque correspondance.

Il existe également des parameters tels que -A / --after-context et -B / --before-context .

L’outil est construit sur le moteur de regex de Rust, ce qui le rend très efficace sur les données volumineuses.

Voici la solution @Ygor dans awk

 awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile 

Remarque: Remplacez les variables a et b par le nombre de lignes avant et après.

C’est particulièrement utile pour les systèmes qui ne supportent pas les parameters -B -A , -B et -C .