grep plik, ale pokazać kilka otaczających linii?

Chciałbym grep Dla ciągu znaków, ale również pokazać poprzednie pięć linii i następne pięć linii, a także dopasowaną linię. Jak miałbym to zrobić?

Author: alexy13, 2008-08-12

9 answers

Dla BSD lub GNU grep możesz użyć -B num, aby ustawić liczbę linii przed meczem i -A num dla liczby linii po meczu.

grep -B 3 -A 2 foo README.txt

Jeśli chcesz mieć taką samą liczbę linii przed i po, możesz użyć -C num.

grep -C 3 foo README.txt

To pokaże 3 linie przed i 3 linie po.

 3783
Author: Pat Notz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-21 08:33:54

-A i -B będzie działać, podobnie jak -C n (dla n linii kontekstu), lub po prostu -n (dla n linii kontekstu).

 528
Author: Stu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-14 01:13:05

ACK działa z podobnymi argumentami jak grep i akceptuje -C. Ale zwykle lepiej jest przeszukiwać kod.

 66
Author: elmarco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-06 19:36:39
grep astring myfile -A 5 -B 5

To grep "myfile" dla "cierpliwości" i pokazuje 5 linii przed i po każdym meczu

 32
Author: dbr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-12 17:58:00

Normalnie używam

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

Wiele narzędzi, takich jak grep, ma również naprawdę świetne pliki man. Odnosiłem się do strony man grepa bardzo często, ponieważ można z nią zrobić tak wiele.

man grep

Wiele narzędzi GNU posiada również stronę informacyjną , która może zawierać więcej przydatnych informacji oprócz strony podręcznika.

info grep
 16
Author: Sam Merrell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-12 19:11:40

Wyszukaj "17655 "W" /some/file.txt " wyświetlanie kontekstu 10 linii przed i po (za pomocą Awk), wyjście poprzedzone numerem linii, a następnie dwukropkiem. Użyj tego na Solarisie, gdy 'grep' nie obsługuje opcji " - [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;
 8
Author: Malcolm Boekhoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-26 15:31:46

Użyj 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
Author: Chiel ten Brinke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-12 11:25:38

ripgrep

Jeśli zależy ci na wydajności, użyj ripgrep który ma podobną składnię do grep, np.

rg -C5 "pattern" .

-C, --context NUM - Pokaż liczbę linii przed i po każdym meczu.

Istnieją również takie parametry jak -A/--after-context Oraz -B/--before-context.

Narzędzie jest zbudowane na bazie silnika regex Rusta , co sprawia, że jest bardzo wydajnena dużych danych.

 2
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 10:28:35

Oto @ Ygor rozwiązanie W 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

Uwaga: Zastąp zmienne a i b liczbą wierszy przed i po.

Jest to szczególnie przydatne dla systemu, który nie obsługuje grepa -A, -B i -C parametry.

 0
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 10:24:12