grep排除多个字符串


115

我试图查看使用tail的日志文件,-f并希望排除包含以下字符串的所有行:

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

我可以排除这样的一个字符串:

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

但是如何排除包含string1或的行string2

Answers:


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恕我直言更清晰的方法…
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实例和正则表达式的人为要求的方法(让多个字符串在单独的参数中明确指定)。试想一下,在脚本中以编程方式构造该正则表达式以包含可能包含任何内容的字符串…
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(或后者甚至存在)。
Sridhar Sarnobat '16

非常非常有用!
samaspin'3

请注意,您不必为排除列表创建临时文件。在bash中,您可以使用进程替换。如果排除列表有点动态,这很方便,并且您必须在每次使用前仅生成一次就将其生成:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
Miroslav


15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'

11

您可以像这样使用常规grep:

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个进程,而不是将要过滤掉的进程,其中每个进程都会过滤掉一些东西。它可能会大大减慢速度。
Artem Oboturov'17年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.