如何grep包含日志文件中特定单词的行?

joh*_*ohn 13 linux bash shell grep

我有一个大的日志文件,我试图扫描它的特定单词.一般来说,我需要在我的大日志文件上写一些单词并打印出包含这些单词的行.

我知道如何在文件上做简单的grep.假设我的文件名是,abc.log并且我需要找到包含单词"hello"的行,那么我总是这样做,它会打印出我的行.

grep -i "hello" abc.log
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何用grep来组合单词.意思是我会有单词列表,我将扫描我的abc.log文件中的所有这些单词,我将打印出单独包含这些单词的行.

#!/bin/bash

data="hello,world,tester"

# find all the lines which contains word hello or world or tester
Run Code Online (Sandbox Code Playgroud)

所以在我上面的shell脚本中,我将拆分我的数据变量并在abc.log中查找hello word,这样任何包含hello word的行,我都会打印出来,类似于world和tester.

我试图使这个非常通用,所以我只需要在数据变量中添加我的单词列表,而不触及grepping日志的实际逻辑.

bru*_*ski 16

我会使用正则表达式,如下所示:

grep -E 'hello|world|tester' abc.log
Run Code Online (Sandbox Code Playgroud)


o11*_*11c 11

如果将模式存储在文件中,每行一个,则可以使用 grep -f file-with-patterns file-to-search.log

从手册页:

   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)
Run Code Online (Sandbox Code Playgroud)

编辑2018:

自从我写这篇文章以来,我已经意识到以下有趣的边缘情况:

  • 您可以使用管道读取模式列表-f -(如果您不需要stdin,即您在grep的命令行上指定了文件)或-f <()(在任何情况下)
  • grep如果传递数百个模式,性能开始严重失败.如果您的用例太疯狂,请考虑生成并立即执行sed(或其他语言)脚本,尽管这可能会导致重叠模式出现问题.


Man*_*nde 6

除了bruchowski 的回答之外,您还可以使用:

grep -i -e "hello" -e "world" -e "tester" abc.log
Run Code Online (Sandbox Code Playgroud)

或者

grep 'hello\|world\|tester' abc.log
Run Code Online (Sandbox Code Playgroud)

或者

egrep 'hello|world|tester' abc.log
Run Code Online (Sandbox Code Playgroud)