Grep -A1: как показать только следующую строку после согласованного

grep -A1 'blah' logfile

Благодаря этой команде для каждой строки, которая имеет "blah" в ней, я получаю вывод строки, содержащей "blah" и следующую строку, которая следует в файле журнала. Это может быть простой, но я не могу найти способ пропустить строку с "бла" и отображать только следующую строку на выходе.

Ответ 1

вы можете попробовать с awk:

awk '/blah/{getline; print}' logfile

Ответ 2

если вы хотите придерживаться grep:

grep -A1 'blah' logfile|grep -v "blah"

или

sed -n '/blah/{n;p;}' logfile

Ответ 3

Трубопровод - ваш друг...

Используйте grep -A1, чтобы отобразить следующую строку после, затем передайте результат на tail и возьмите только 1 строку,

cat logs/info.log | grep "term" -A1 | tail -n 17

Ответ 4

Отличный ответ от raim, был очень полезен для меня. Тривиально распространять это на печать, например. строка 7 после шаблона

awk -v lines=7 '/blah/ {for(i=lines;i;--i)getline; print $0 }' logfile

Ответ 5

Похоже, вы используете там неправильный инструмент. Греп не настолько утончен, я думаю, вы хотите активировать awk как инструмент для работы:

awk '/blah/ { getline; print $0 }' logfile

Если у вас возникнут какие-либо проблемы, дайте мне знать, я думаю, что его стоит изучить немного awk, это отличный инструмент:)

p.s. Этот пример не выигрывает "бесполезное использование награды кошки";) http://porkmail.org/era/unix/award.html

Ответ 6

Я не знаю, как это сделать с помощью grep, но для достижения такого же результата можно использовать awk:

awk '/blah/ {getline;print}' < logfile

Ответ 7

Если следующие строки никогда не будут содержать "бла", вы можете отфильтровать их grep -A1 blah logfile | grep -v blah Использование "cat logfile |..." не требуется.

Ответ 8

В общем, я согласен, что вы задаете много grep здесь, и другой инструмент может быть лучшим решением. Но во встроенной среде я, возможно, не хочу иметь sed или awk только для этого. Я нашел следующее решение (пока они не являются непрерывными совпадениями):

grep -A1 AT\+CSQ wvdial.out | grep -v AT\+CSQ

В принципе, сопоставьте их, добавив 1 строку контекста для каждого совпадения, а затем передайте это через обратный совпадение исходного шаблона, чтобы удалить их. Это, конечно, означает, что вы можете предположить, что ваш шаблон не отображается в "следующей" строке.

Ответ 9

До сих пор было дано много хороших ответов на этот вопрос, но я все еще пропустил один с awk, не используя getline. Поскольку вообще, нет необходимости использовать getline, я бы пошел за:

awk ' f && NR==f+1; /blah/ {f=NR}' file  #all matches after "blah"

или

awk '/blah/ {f=NR} f && NR==f+1' file   #matches after "blah" not being also "blah"

Логика всегда заключается в сохранении строки, в которой обнаружено "бла" , а затем печатайте те строки, которые являются одной строкой после.

Test

Пример файла:

$ cat a
0
blah1
1
2
3
blah2
4
5
6
blah3
blah4
7

Получите все строки после "бла" . Это печатает еще один "бла" , если он появляется после первого.

$ awk 'f&&NR==f+1; /blah/ {f=NR}' a
1
4
blah4
7

Получите все строки после "бла" , если они не содержат "бла" .

$ awk '/blah/ {f=NR} f && NR==f+1' a
1
4
7

Ответ 10

perl однострочное оповещение

просто для удовольствия... напечатайте только одну строку после матча

perl -lne '$next=($.+1)if/match/;$.==$next&&print' data.txt

еще веселее... напечатайте следующие десять строк после матча

perl -lne '[email protected],(($.+1)..($.+10))if/match/;[email protected]&&print' data.txt

любопытное обман, хотя, поскольку на самом деле есть две команды