grep -A1 'blah' logfile
Dzięki temu poleceniu dla każdej linii, która zawiera „bla”, otrzymuję wynik linii zawierającej „bla” i kolejną linię, która następuje w pliku dziennika. Może to być proste, ale nie mogę znaleźć sposobu na pominięcie wiersza zawierającego słowo „bla” i wyświetlenie tylko następnego wiersza na wyjściu.
-A1
opcjicurl whatismyip.org | grep -A1 'Your IP Address'
-A1
. Dzięki!Odpowiedzi:
możesz spróbować z awk:
źródło
awk '/blah/{getline; getline; print}' logfile
jeśli chcesz trzymać się grep:
lub
źródło
Rurociągi to twój przyjaciel ...
Użyj,
grep -A1
aby wyświetlić kolejną linię po meczu, a następnie przesuń wynik dotail
i złap tylko 1 linię,źródło
Świetna odpowiedź od Raima, była dla mnie bardzo przydatna. Rozbudowanie tego jest trywialne, np. Wiersz 7 po wzorze
źródło
Jeśli następne wiersze nigdy nie zawierają „bla”, możesz je filtrować za pomocą:
Korzystanie z
cat logfile | ...
nie jest potrzebne.źródło
Ogólnie rzecz biorąc, zgadzam się, że pytasz tutaj o grep i że innym narzędziem może być lepsze rozwiązanie. Ale w środowisku osadzonym może nie chcę tego robić
sed
lubawk
po prostu to robić. Odkryłem, że działa następujące rozwiązanie (o ile nie są to ciągłe dopasowania):Zasadniczo dopasuj je, dodając 1 linię kontekstu dla każdego dopasowania, a następnie przeprowadź go przez odwrotne dopasowanie oryginalnego wzoru, aby je usunąć. To oczywiście oznacza, że możesz założyć, że twój wzór nie pojawia się w „następnym” wierszu.
źródło
Do tej pory udzielono wielu dobrych odpowiedzi na to pytanie, ale wciąż brakuje mi jednej z nich, gdy się
awk
nie korzystagetline
. Ponieważ, ogólnie rzecz biorąc , nie jest konieczne użyciegetline
, wybrałbym:lub
Logika zawsze polega na zapisaniu wiersza, w którym znajduje się „bla”, a następnie wydrukowaniu tych wierszy, które są po jednym wierszu.
Test
Przykładowy plik:
Zdobądź wszystkie linie po „bla”. To wypisuje kolejne „bla”, jeśli pojawia się po pierwszym.
Zdobądź wszystkie wiersze po „bla”, jeśli same nie zawierają „bla”.
źródło
Nie wiem, jak to zrobić za pomocą grep, ale można użyć awk, aby osiągnąć ten sam wynik:
źródło
Perl One-Liner Alert
tylko dla zabawy ... drukuj tylko jedną linię po meczu
jeszcze więcej zabawy ... wydrukuj kolejne dziesięć linii po meczu
trochę oszustwo, ponieważ tak naprawdę są dwa polecenia
źródło
$. == $next && print
jest taki sam jakprint if $. == $next
grep -A1
). Jeśli chcesz wydrukować tylko kolejne wiersze, ale nigdy nie pasuje do dopasowania, zachowaj tę kolejność. (tylko zwracając uwagę na to, że $ next będzie zdobyte przez kolejne mecze)Wygląda na to, że używasz niewłaściwego narzędzia. Grep nie jest tak wyrafinowany, myślę, że chcesz skorzystać z awk jako narzędzia do tego zadania:
awk '/blah/ { getline; print $0 }' logfile
Jeśli pojawią się jakiekolwiek problemy, daj mi znać, myślę, że warto nauczyć się trochę awk, to świetne narzędzie :)
ps Ten przykład nie wygrywa „bezużytecznego wykorzystania nagrody kota”;) http://porkmail.org/era/unix/award.html
źródło
grep / Pattern / | ogon -n 2 | głowa -n 1
Ogon pierwszy 2, a następnie ostatni, aby uzyskać dokładnie pierwszą linię po meczu.
źródło