grep виключає кілька рядків


115

Я намагаюся бачити файл журналу за допомогою хвоста -fі хочу виключити всі рядки, що містять такі рядки:

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

Я можу виключити такий рядок, як цей:

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

Але як я виключаю рядки, що містять будь-який з string1або string2.

Відповіді:


106

Два приклади фільтрації декількох рядків за допомогою 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метод, який IMHO зрозуміліший…
Frizlab

4
Або ще краще: grep -Fv -e def -e jklщо ще швидше!
Фрізлаб

11
З прапорцем -F ви можете використовувати нові рядки як роздільники замість труб. Це дозволяє простіше використовувати командний вихід як фільтр, наприклад:grep -vF $(pgrep myprocess)
Фларкс,

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

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

-v перевертає сірник

-e дозволяє використовувати декілька моделей пошуку (всі буквальні та перевернуті)


1
Це правильна відповідь: Єдина, яка уникає як декількох grep -vпримірників, так і штучної вимоги регулярного вираження (дозволяє декілька рядків чітко вказати в окремих аргументах). Уявіть собі, як програматично побудувати цей регекс у сценарії для рядків, які можуть містити що-небудь…
user2394284

Насправді жоден із них не є правильною відповіддю, тому що при передачі жодного ключового слова для виключення він не виключає нічого, а нічого.
Győri Sándor

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
Я не розумію , ви могли б використовувати -vз -f(або що існував останній навіть).
Шрідхар Сарнобат

дуже дуже корисно!
самаспін

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



11

Ви можете використовувати звичайний греп, як це:

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


1
Ця відповідь працювала для мене на MacOSX. Уникнути труби є ключовим
Ребекка Дессонвіль

5

Грейп можна прикувати ланцюгом. Наприклад:

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.