Chciałbym napisać grep
ciąg, ale także pokazać poprzednie pięć wierszy i kolejne pięć wierszy, a także dopasowaną linię. Jak mógłbym to zrobić?
man grep | grep -C 1 context
:)
man grep | grep -C 1 "\-C"
;)
Chciałbym napisać grep
ciąg, ale także pokazać poprzednie pięć wierszy i kolejne pięć wierszy, a także dopasowaną linię. Jak mógłbym to zrobić?
man grep | grep -C 1 context
:)
man grep | grep -C 1 "\-C"
;)
Odpowiedzi:
W przypadku BSD lub GNU grep
można użyć, -B num
aby ustawić liczbę linii przed dopasowaniem i -A num
liczbę linii po dopasowaniu.
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.
-A
i -B
będzie działać, jak będzie -C n
(dla n
linii kontekstu), lub po prostu -n
(dla n
linii kontekstu ... o ile n wynosi od 1 do 9).
-n
format i okazało się, że działa tylko do 9
. Na 15
to zwraca 5 linii
-A
, -B
lub -C
). Zwykle po specyfikatorze opcji znajduje się wartość ( -o a.out
określająca plik wyjściowy w GCC), ale może również działać jako zwykły przełącznik / flaga ( -g
aby umożliwić debugowanie informacji w GCC). Jednak odstępy między opcjami są opcjonalne, więc w przypadku opcji bez wartości można je scalić ( -ABC
), co oznacza, że -15
jest interpretowany -1 -5
(dwie oddzielne opcje) i -5
zastępuje -1
.
ack działa z podobnymi argumentami jak grep i akceptuje -C
. Ale zwykle lepiej jest przeszukiwać kod.
grep
, nie jest pewne użycie go do „reklamowania się” ack
(co jest naprawdę świetnym narzędziem) - to dobry pomysł…
grep astring myfile -A 5 -B 5
Spowoduje to wstawienie „myfile” do „astring” i wyświetlenie 5 linii przed i po każdym meczu
Zwykle 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. Znalazłem się powołując się na stronie man grep wiele, ponieważ jest tak wiele można zrobić z nim.
man grep
Wiele narzędzi GNU ma także stronę informacyjną, która może zawierać bardziej przydatne informacje oprócz strony man.
info grep
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
Wyszukaj „17655” w „/some/file.txt”, pokazując kontekst 10 linii przed i po (używając Awk), dane wyjściowe poprzedzone numerem linii, a następnie dwukropkiem. Użyj tego w systemie Solaris, 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;
ripgrep
Jeśli zależy Ci na wydajności, użyj ripgrep
podobnej składni grep
, np
rg -C5 "pattern" .
-C
,--context NUM
- Pokaż NUM wierszy przed i po każdym meczu.
Istnieją również parametry takie jak -A
/ --after-context
i -B
/ --before-context
.
Narzędzie zostało zbudowane na silniku regularnym Rust, co czyni go bardzo wydajnym w przypadku dużych danych.
Oto rozwiązanie @Ygor wawk
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: Zamień a
i b
zmienne z liczbą linii przed i po.
Jest to szczególnie przydatne dla systemu, który nie obsługuje grepa -A
, -B
i -C
parametry.
Jeśli często wyszukujesz kod, AG srebrny wyszukiwarka jest znacznie wydajniejszy (tj. Szybszy) niż grep.
Wyświetlane są linie kontekstu za pomocą opcji -C.
Na przykład:
ag -C 3 "foo" myFile
line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7