Как удалить n строк в лог-файле только после первого совпадения шаблона - PullRequest
1 голос
/ 17 октября 2019

У меня есть файл журнала, который содержит несколько повторений шаблона Fre --. Мне нужно удалить только первое вхождение этого шаблона и следующие 20 строк после него и сохранить другие совпадения нетронутыми. Мне нужно сделать это в терминале Bash, используя sed предпочтительно или awk или perl. Я был бы очень признателен за вашу помощь.

Я пытался

sed -e '/Fre --/,+20d' log.log

, но после этого удаляются все шаблоны и следующие 20 строк. Я хочу удалить только первый шаблон

Здесь есть более или менее похожий вопрос и несколько ответов: Как удалить только первое вхождение строки в файле, используя sed , но яне знаю, как изменить его, чтобы удалить 20 строк после первого совпадения

Ответы [ 2 ]

1 голос
/ 17 октября 2019
$ seq 20 | awk '!f && /3/{c=4; f=1} !(c&&c--)'
1
2
7
8
9
10
11
12
13
14
15
16
17
18
19
20

См. Печать с помощью sed или awk, строка, соответствующая шаблону

1 голос
/ 17 октября 2019

Я уверен, что кто-то найдет хорошую команду sed, но я знаю awk лучше.

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

awk '/Fre --/ && !found++{counter=21}--counter<0' log.log

Пояснения:

/Fre --/ -> если он находит шаблон Fre --

&& !found++ -> и если он не нашел его раньше

{counter=21} -> он устанавливает значение счетчика в 21 (потому что вы хотите удалить строку + следующие 20 с)

--counter<0 -> уменьшает счетчик и печатает строку только если счетчик <0 </p>

Как указано @Sundeep, @EdMorton solutionбезопаснее для очень больших файлов.

awk '/Fre --/ && !found++{counter=21}!(counter&&counter--)' log.log
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...