grep排除多个字符串

Jee*_*ets 103 linux ubuntu

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

"Nopaging the limit is"`  and `"keyword to remove is"
Run Code Online (Sandbox Code Playgroud)

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

tail -f admin.log|grep -v "Nopaging the limit is"
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ski 95

使用grep过滤多行的两个示例:

把它放进去filename.txt:

abc
def
ghi
jkl
Run Code Online (Sandbox Code Playgroud)

grep命令使用-E选项,在字符串中的标记之间使用管道:

grep -Ev 'def|jkl' filename.txt
Run Code Online (Sandbox Code Playgroud)

打印:

abc
ghi
Run Code Online (Sandbox Code Playgroud)

使用-v选项的命令,其中包含由parens包围的标记之间的管道:

egrep -v '(def|jkl)' filename.txt
Run Code Online (Sandbox Code Playgroud)

打印:

abc
ghi
Run Code Online (Sandbox Code Playgroud)

  • 我很惊讶没有人谈到`grep -v -e def -e jkl`方法,恕我直言更清楚... (12认同)
  • 使用-F标志,您可以使用换行符作为分隔符而不是管道.这允许更容易地使用命令输出作为过滤器,例如:`grep -vF $(pgrep myprocess)` (9认同)
  • 甚至更好:`grep -Fv -e def -e jkl`哪个更快! (4认同)

rez*_*ter 35

另一种选择是创建一个排除列表,当您有一长串需要排除的内容时,这是特别有用的.

vi /root/scripts/exclude_list.txt
Run Code Online (Sandbox Code Playgroud)

现在添加您要排除的内容

Nopaging the limit is
keyword to remove is
Run Code Online (Sandbox Code Playgroud)

现在使用grep从文件日志文件中删除行并查看未排除的信息.

grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log
Run Code Online (Sandbox Code Playgroud)

  • 我没有意识到你可以将“-v”与“-f”一起使用(或者后者甚至存在)。 (2认同)
  • 请注意,您不必为排除列表创建临时文件。在 bash 中,您可以使用进程替换。如果排除列表有点动态,并且您必须在每次使用之前生成它并且仅使用一次:`grep -v -f <(gen_exclusions.sh) /var/log/admin.log` (2认同)

wis*_*cky 35

grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'
Run Code Online (Sandbox Code Playgroud)

-F 按文字字符串匹配(而不是正则表达式)

-v 反转比赛

-e 允许多种搜索模式(所有文字和倒置)

  • 这是正确的答案:唯一避免多个`grep -v` 实例和正则表达式的人为要求的方法(让多个字符串在单独的参数中明确指定)。想象一下在脚本中以编程方式为可以包含任何内容的字符串构建正则表达式…… (2认同)

Ste*_*ski 21

egrep -v "Nopaging the limit is|keyword to remove is"
Run Code Online (Sandbox Code Playgroud)


hs.*_*dra 12

tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'
Run Code Online (Sandbox Code Playgroud)


mik*_*ail 10

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

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


Fid*_*del 5

greps可以链接.例如:

tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"
Run Code Online (Sandbox Code Playgroud)

  • 这里的问题是,您必须顺序运行 N 个进程,而不是过滤掉的进程,其中每个进程都会过滤掉一些东西。它可能会显着减慢速度。 (3认同)