Wiem, że dzięki grep mogę używać pól -A
i -B
wyciągać poprzednie i następne wiersze z meczu.
Wciągają jednak wszystkie linie między dopasowaniami w zależności od liczby określonych linii.
grep -r -i -B 5 -A 5 "match"
Chciałbym otrzymać tylko te 5 th linię przed meczem i 5 th wiersz po meczu oprócz dopasowanej linii i nie dostać się granice pomiędzy.
Czy jest na to sposób grep
?
command-line
grep
awk
chollida
źródło
źródło
grep -r -i -B 5 -A 5 "match" | sed -e 1b -e '$!d'
Odpowiedzi:
Narzędzie, którego chcesz użyć, nazywa się sift. Jest to w zasadzie grep na sterydach. Grep równolegle. Sift ma ogromną liczbę opcji, aby zrobić dokładnie to, co chcesz - w szczególności zwrócić konkretną linię względem dopasowania (-ów), po których może / może nie następować / poprzedzony jakimś tekstem.
Dziwi mnie, że sift nie jest głównym nurtem GNU, ponieważ został napisany w języku go, ale instaluje się w systemie Linux w porządku. IT wyszukuje równolegle, używając wszystkich ogromnych ilości tekstu, gdzie grep zajmuje to samo tygodnie.
Sift website - patrz przykłady
źródło
Gdyby:
Następnie:
źródło
/match/ {matched[NR]}
? Nigdy nie widziałem tablicy ani zmiennej jako całego polecenia. Czy umieszcza bieżący numer rekordu każdej dopasowanej linii w tablicy?key in array
. Pamiętam numery linii, w których pojawia się wzórJest to w zasadzie rozwiązanie Glenna, ale zaimplementowane z Bash, Grep i sed.
Zauważ, że numery linii mniejsze niż 1 spowodują błąd sed, a numery linii większe niż liczba linii w pliku sprawią, że nic nie wydrukuje.
To tylko absolutne minimum. Aby działało rekurencyjnie i obsługiwało przypadki powyższych numerów linii, zajęłoby trochę czasu.
źródło
Tego nie da się zrobić tylko
grep
. Jeślied
jest to opcja:Skrypt w zasadzie mówi: dla każdego dopasowania / match /, wypisz wiersz 5 linii wcześniej, potem 5 linii później, a następnie 5 linii później.
źródło
ed
jest zawsze odpowiedzią, ponieważed
jest standardowym edytorem tekstu.grep
odpowiedź, odpowiedź „Nie możesz tego zrobić za pomocą X, ale możesz to zrobić za pomocą Y, oto jak” nadal jest poprawną odpowiedzią, ponieważ nie tylko odpowiadasz na pytanie OP, ale także stanowisz alternatywę to powinno działać. To jest poprawny typ odpowiedzi tutaj.Tutaj używamy awk „s funkcję zadzwonić zewnętrznego polecenia, aby wydrukować linie, które awk dopasowane wzorkiem z 5 th linii przed i po meczu.
system(command)
sed
match
Składnia jest łatwa, wystarczy umieścić zewnętrzne polecenie w cudzysłowie, a także jego przełączniki i uciec od tego, co chcesz dokładnie przekazać do polecenia, wszystko inne związane z
awk
samymi opcjami powinno znajdować się poza cudzysłowami. Więc poniżej sed :Przetłumacz na:
NR
jest liczbą linii, która pasuje do wzorcamatch
iFILENAME
jest przetwarzanie prądu nazwa pliku Mijającawk
.źródło
używając przykładowego pliku tekstowego @ glenn i używając perla zamiast awk:
da te same wyniki, ale działa szybciej:
źródło