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.

Jeets
источник

Ответы:

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 позволяет использовать несколько шаблонов поиска (все буквальные и перевернутые)

wisbucky
источник
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
rezizter
источник
1
Я не знал, что вы можете использовать -vwith -f(или что последний вообще существует).
Шридхар Сарнобат
очень очень полезно!
samaspin
Обратите внимание, что вам не нужно создавать временный файл для списка исключений. В bash вы можете использовать замену процесса. Это удобно, если список исключений в некотором роде динамический, и вам придется генерировать его перед каждым использованием только для однократного использования:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
Мирослав
22
egrep -v "Nopaging the limit is|keyword to remove is"
Стефан Подковинский
источник
15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'
hs.chandra
источник
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 процессов последовательно, каждый из которых что-то фильтрует. Это могло значительно замедлить работу.
Артем Оботуров