grep исключить несколько строк


117

Я пытаюсь просмотреть файл журнала с помощью tail -fи хочу исключить все строки, содержащие следующие строки:

"Nopaging the limit is"`  and `"keyword to remove is"

Я могу исключить одну строку вот так:

tail -f admin.log|grep -v "Nopaging the limit is"

Но как мне исключить строки, содержащие одно из string1или string2.

Ответы:


107

Два примера фильтрации нескольких строк с помощью grep:

Поместите это в filename.txt:

abc
def
ghi
jkl

Команда grep с использованием параметра -E с вертикальной чертой между токенами в строке:

grep -Ev 'def|jkl' filename.txt

печатает:

abc
ghi

Команда, использующая параметр -v с вертикальной чертой между токенами, окруженными скобками:

egrep -v '(def|jkl)' filename.txt

печатает:

abc
ghi

15
Я удивлен, что никто не сказал о grep -v -e def -e jklметоде, который, по ИМХО, яснее…
Frizlab

4
Или даже лучше: grep -Fv -e def -e jklчто еще быстрее!
Frizlab

11
С флагом -F вы можете использовать символы новой строки в качестве разделителей вместо каналов. Это позволяет более легко использовать вывод команды в качестве фильтра, например:grep -vF $(pgrep myprocess)
Phlarx

45
grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'

-F соответствует буквальным строкам (вместо регулярного выражения)

-v переворачивает матч

-e позволяет использовать несколько шаблонов поиска (все буквальные и перевернутые)


1
Это правильный ответ: единственный, который позволяет избежать как нескольких grep -vэкземпляров, так и искусственного требования регулярного выражения (позволяет четко указывать несколько строк в отдельных аргументах). Только представьте себе создание этого регулярного выражения программным
способом

На самом деле ни один из этих ответов не является правильным, потому что при отсутствии ключевых слов для исключения он будет исключать все, а не ничего.
Дьёри Шандор

37

Другой вариант - создать список исключений, это особенно полезно, когда у вас есть длинный список вещей, которые нужно исключить.

vi /root/scripts/exclude_list.txt

Теперь добавьте то, что вы хотите исключить

Nopaging the limit is
keyword to remove is

Теперь используйте grep, чтобы удалить строки из файла журнала и просмотреть не исключенную информацию.

grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log

1
Я не знал, что вы можете использовать -vwith -f(или что последний вообще существует).
Шридхар Сарнобат

очень очень полезно!
samaspin

Обратите внимание, что вам не нужно создавать временный файл для списка исключений. В bash вы можете использовать замену процесса. Это удобно, если список исключений в некотором роде динамический, и вам придется генерировать его перед каждым использованием только для однократного использования:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
Мирослав



11

Вы можете использовать обычный grep следующим образом:

tail -f admin.log | grep -v "Nopaging the limit is\|keyword to remove is"


1
Этот ответ работал у меня на MacOSX. Ключ к
выходу

5

Greps можно связать цепочкой. Например:

tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"

1
Уловка здесь в том, что вместо процесса, который будет отфильтровываться, вам придется запускать N процессов последовательно, каждый из которых что-то фильтрует. Это могло значительно замедлить работу.
Артем Оботуров
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.