Ответ 1
вы можете попробовать с awk:
awk '/blah/{getline; print}' logfile
grep -A1 'blah' logfile
Благодаря этой команде для каждой строки, которая имеет "blah" в ней, я получаю вывод строки, содержащей "blah" и следующую строку, которая следует в файле журнала. Это может быть простой, но я не могу найти способ пропустить строку с "бла" и отображать только следующую строку на выходе.
вы можете попробовать с awk:
awk '/blah/{getline; print}' logfile
если вы хотите придерживаться grep:
grep -A1 'blah' logfile|grep -v "blah"
или
sed -n '/blah/{n;p;}' logfile
Трубопровод - ваш друг...
Используйте grep -A1
, чтобы отобразить следующую строку после, затем передайте результат на tail
и возьмите только 1 строку,
cat logs/info.log | grep "term" -A1 | tail -n 17
Отличный ответ от raim, был очень полезен для меня. Тривиально распространять это на печать, например. строка 7 после шаблона
awk -v lines=7 '/blah/ {for(i=lines;i;--i)getline; print $0 }' logfile
Похоже, вы используете там неправильный инструмент. Греп не настолько утончен, я думаю, вы хотите активировать awk как инструмент для работы:
awk '/blah/ { getline; print $0 }' logfile
Если у вас возникнут какие-либо проблемы, дайте мне знать, я думаю, что его стоит изучить немного awk, это отличный инструмент:)
p.s. Этот пример не выигрывает "бесполезное использование награды кошки";) http://porkmail.org/era/unix/award.html
Я не знаю, как это сделать с помощью grep, но для достижения такого же результата можно использовать awk:
awk '/blah/ {getline;print}' < logfile
Если следующие строки никогда не будут содержать "бла", вы можете отфильтровать их
grep -A1 blah logfile | grep -v blah
Использование "cat logfile |..." не требуется.
В общем, я согласен, что вы задаете много grep здесь, и другой инструмент может быть лучшим решением. Но во встроенной среде я, возможно, не хочу иметь sed
или awk
только для этого. Я нашел следующее решение (пока они не являются непрерывными совпадениями):
grep -A1 AT\+CSQ wvdial.out | grep -v AT\+CSQ
В принципе, сопоставьте их, добавив 1 строку контекста для каждого совпадения, а затем передайте это через обратный совпадение исходного шаблона, чтобы удалить их. Это, конечно, означает, что вы можете предположить, что ваш шаблон не отображается в "следующей" строке.
До сих пор было дано много хороших ответов на этот вопрос, но я все еще пропустил один с 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"
Логика всегда заключается в сохранении строки, в которой обнаружено "бла" , а затем печатайте те строки, которые являются одной строкой после.
Пример файла:
$ 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
perl однострочное оповещение
просто для удовольствия... напечатайте только одну строку после матча
perl -lne '$next=($.+1)if/match/;$.==$next&&print' data.txt
еще веселее... напечатайте следующие десять строк после матча
perl -lne '[email protected],(($.+1)..($.+10))if/match/;[email protected]&&print' data.txt
любопытное обман, хотя, поскольку на самом деле есть две команды