grep un fichier, mais de montrer autour de plusieurs lignes?

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 appariée. Comment serais-je capable de faire cela?

2829
demandé sur alexy13 2008-08-12 21:55:32
la source

9 ответов

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

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 affichera 3 lignes avant et 3 lignes après.

3783
répondu Pat Notz 2017-09-21 11:33:54
la source

-A et -B va travailler, tout comme -C n (pour n lignes de contexte), ou simplement -n (pour n lignes de contexte).

528
répondu Stu 2013-03-14 05:13:05
la source

ack fonctionne avec des arguments similaires que grep, et accepte -C . Mais c'est généralement mieux pour chercher à travers le code.

66
répondu elmarco 2017-01-06 22:36:39
la source
grep astring myfile -A 5 -B 5

qui va grep "myfile" pour "astring", et de montrer 5 lignes avant et après chaque match

32
répondu dbr 2008-08-12 21:58:00
la source

j'ai l'habitude d'utiliser

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

beaucoup d'outils comme grep ont aussi de très grands fichiers man. Je me retrouve à faire référence à grep's man page beaucoup parce qu'il y a tellement de choses que vous pouvez faire avec elle.

man grep

beaucoup d'outils GNU ont aussi une page d'information "1519100920 qui peut avoir des informations plus utiles en plus de la page de manuel.

info grep
16
répondu Sam Merrell 2008-08-12 23:11:40
la source

Rechercher "17655" dans "/certains/fichier.txt " montrant le contexte de 10 lignes avant et après (en utilisant Awk), sortie précédée d'un numéro de ligne suivi de deux points. Utilisez cette option sur Solaris lorsque 'grep' ne supporte pas les options "-[ACB]".

awk '

/17655/ {
        for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
                print before[i]
        }
        print (NR ":" ("151900920"))
        a = 10
}

a-- > 0 {
        print (NR ":" ("151900920"))
}

{
        before[b] = (NR ":" ("151900920"))
        b = (b + 1) % 10
}' /some/file.txt;
8
répondu Malcolm Boekhoff 2013-12-26 19:31:46
la source

Utiliser 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
5
répondu Chiel ten Brinke 2018-01-12 14:25:38
la source

ripgrep

si vous vous souciez de la performance, utilisez ripgrep qui a une syntaxe similaire à grep , par exemple

rg -C5 "pattern" .

-C , --context NUM - afficher les lignes NUM avant et après chaque match.

il y a aussi des paramètres tels que -A / --after-context et -B / --before-context .

l'outil est construit sur le dessus de moteur regex de Rust qui le rend très efficace sur les grandes données.

2
répondu kenorb 2018-04-11 13:28:35
la source

Voici la @Ygor solution in awk

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

Note: remplacer a et b par le nombre de lignes avant et après.

il est particulièrement utile pour le système qui ne supporte pas les paramètres -A , -B et -C de grep.

0
répondu kenorb 2018-04-11 13:24:12
la source

Autres questions sur