grep -v несколько строк одновременно - PullRequest
1 голос
/ 13 мая 2019

Я бы хотел отфильтровать строки, содержащие "pattern" и следующие 5 строк.

Что-то вроде grep -v -A 5 'pattern' myfile.txt с выводом:

other
other
other
other
other
other

Меня интересуют решения для оболочки linux, grep, awk, sed ... Thx

myfile.txt:

other
other
other
pattern
follow1
follow2
follow3
follow4
follow5
other
other
other
pattern
follow1
follow2
follow3
follow4
follow5
other
other
other
other
other
other

Ответы [ 3 ]

4 голосов
/ 13 мая 2019

Вы можете использовать awk:

awk '/pattern/{c=5;next} !(c&&c--)' file

В основном: мы уменьшаем целое число c в каждой строке ввода.Мы печатаем строки, когда c равно 0.* (см. ниже) Примечание: c будет автоматически инициализироваться с помощью 0 с помощью awk при первом его использовании.

Когда слово pattern найдено, мы устанавливаем c в 5, чтоделает c--<=0 false для 5 строк и заставляет awk не печатать эти строки.


* Мы могли бы использовать c--<=0, чтобы проверить, является ли c меньше или равен 0.Но если между вхождениями слова pattern имеется много (!) Строк, c может переполниться.Чтобы избежать этого, oguz ismail предложил реализовать проверку следующим образом:

!(c&&c--)

Это проверит, если c равно trueish (больший ноль) и толькозатем декремент c.c никогда не будет меньше 0 и поэтому не переполнится.Обращение этой проверки !(...) заставляет awk печатать правильные строки.


Примечание: обычно вы используете слово regexp, если вы имеете в виду регулярное выражение, а не pattern.

2 голосов
/ 13 мая 2019

С GNU sed (должно быть в порядке, так как Linux упоминается OP)

sed '/pattern/,+5d' ip.txt

, который удаляет строки, соответствующие данному регулярному выражению, и 5 строк, следующих за

0 голосов
/ 13 мая 2019

Я сделал это, используя это:

head -$(wc -l myfile.txt | awk '{print $1-5 }') myfile.txt | grep -v "whatever"

, что означает:

wc -l myfile.txt    : how many lines (but it also shows the filename)
awk '{print $1}'    : only show the amount of lines
awk '{print $1-5 }' : we don't want the last five lines
head ...            : show the first ... lines (which means, leave out the last five)
grep -v "..."       : this part you know :-)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...