grep -A 2 -B 3
wypisuje 2 linie po łańcuchu grep i wypisuje 3 linie wcześniej.
grep -C 3
drukuje 3 linie przed i 3 linie po
Niestety grep
używam nie obsługuje tych opcji. Czy są dostępne alternatywne polecenia lub skrypt do symulacji tego? Używasz skryptów powłoki sed
/ awk
/ perl
/?
text-processing
grep
awk
perl
Prashant Bhate
źródło
źródło
-C
przełącznik.GNU > /usr/local
. Programy GNU mają wiele bardzo przydatnych rozszerzeń i zostały zaprojektowane w celu uniknięcia arbitralnych ograniczeń (ale płacisz drogo za rozmiar, a czasem za wydajność). Wiele zastrzeżonych systemów ma „nieoficjalne” repozytoria pakietów z GNU i innymi narzędziami. „Partner” nie powie Ci o nich, nawet jeśli są one zarządzane przez dostawcę ...Odpowiedzi:
Jednym z umiarkowanie brzydkich sposobów jest to
lub wymienić
-c
z-C NUM
zaNUM
linii kontekstu. Będzie jednak generować dodatkową wydajność. (Jeśli twojediff
wsparcie-u
/-U NUM
, będzie czystsze.)Jeśli
diff
nie masz-c
/-C
/-u
, wciąż możesz to zrobić, ale są one dość brzydkie. Z drugiej strony, system, którydiff
nawet nie obsługuje-c
prawdopodobnie też nie ma Perla.źródło
grep -v pattern file | diff -c - file
ACK wymaga tylko Perl i obejmuje
-A
,-B
oraz-C
opcje, które działają jak grep jest. Używa składni wyrażenia regularnego Perla zamiast grepa, a sposób wybierania plików do wyszukiwania jest zupełnie inny. Możesz wypróbować tę-f
opcję podczas korzystania z niej (która drukuje pliki, które będzie przeszukiwać bez szukania czegokolwiek).Można go zainstalować jako pojedynczy skrypt, który nie wymaga modułów innych niż rdzeń. Po prostu upuść go w swoim
~/bin
katalogu (lub gdziekolwiek indziej na PATH, do którego masz dostęp do zapisu) i upewnij się, że jestchmod
wykonywalny.źródło
ack
na własny użytek.Ten prosty skrypt perla
grep -A
do pewnego stopnia emulujePamiętaj, że możesz dodać instrukcję użytkowania, aby skrypt był czytelny i użyteczny;)
źródło
grep-A 3 foo
wygląda o wiele bardziej naturalnie niżgrep-A foo 3
. :-)Możesz po prostu zainstalować GNU grep lub Ack (napisane w Perlu, rozumie wiele opcji GNU grep i więcej).
Jeśli wolisz trzymać się standardowych narzędzi i odrobiny skryptów, oto skrypt awk, który emuluje zachowanie GNU grep
-A
i-B
opcji. Minimalnie przetestowane.Uruchom go
grep-ac -vpattern=PATTERN -vbefore=NBEFORE -vafter=NAFTER
tam, gdziePATTERN
jest wzorzec do wyszukania ( rozszerzone wyrażenie regularne z kilkoma dodatkami awk )NBEFORE
iNAFTER
jest liczbą wierszy do wydrukowania odpowiednio przed i po dopasowaniu (domyślnie 0). Przykład:źródło
{ "exec" "awk" "-f" "$0" "$@"; }
: bardzo fajny sposób na ominięcie ograniczeń w parsowaniu linii shebang.Okazuje się, że emulowanie opcji -B jest dość trudne z powodu problemów, które pojawiają się, gdy masz pasujące linie bezpośrednio po sobie. To w zasadzie uniemożliwia korzystanie z jakiegokolwiek rodzaju skanowania plików z pojedynczym przejściem.
Uświadomiłem sobie to podczas zabawy z następującym przybliżeniem:
Działa to mniej więcej poprawnie, jak grep -A7 -B3, z zastrzeżeniem opisanym w pierwszym akapicie.
Alternatywnym rozwiązaniem (również z jednym plikiem) tego problemu jest użycie perla do podania ciągu polecenia:
źródło
shift @A if push(@A,$_)>7;
Nieco utrzymuje jedynie tablicę maksymalny rozmiar 7 dookoła. (to jest twój parametr -A). Druga opcja utrzymuje niewiarygodnie mały plik (po prostu uruchom perl bez zewnętrznej warstwy sed, aby zobaczyć, co tam jest generowane), ale odczytuje plik dwa razy.Za pomocą tego
sed
możesz najpierw uzyskać numery pasujących linii, zmniejszyć i zwiększyć dany numer linii wwhile
pętli, a następnie użyćsed -n "n1,n2p"
do wydrukowania linii kontekstu wiodącego (n1
) i trailing (n2
) (podobnie dosed
alternatywy sugerowanej przez user455). Wiele procesów odczytu może jednak doprowadzić do spadku wydajności.ed
może bezpośrednio odwoływać się do poprzednich i następnych wierszy dopasowanej linii, ale kończy się niepowodzeniem, jeśli określony zakres linii nie istnieje; na przykład pasująca linia to linia nr 2, ale należy wydrukować 5 linii przedmeczowych. Korzystanieed
Konieczne jest zatem, aby dodać odpowiednią liczbę linii (pusty) na początku i na końcu. (W przypadku dużych plikówed
może nie być to właściwe narzędzie, patrz: bfs - skaner dużych plików ).źródło