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.