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

时间:2014-10-10 04:42:22

标签: linux bash shell grep

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

我知道如何在文件上做简单的grep。假设我的文件名是abc.log,我需要找到一行包含单词" hello"然后我总是这样做,它打印出我的线。

grep -i "hello" abc.log

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

#!/bin/bash

data="hello,world,tester"

# find all the lines which contains word hello or world or tester

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

我正在尝试使这个非常通用,这样我只需要在数据变量中添加我的单词列表,而不会触及greting日志的实际逻辑。

3 个答案:

答案 0 :(得分:15)

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

grep -E 'hello|world|tester' abc.log

答案 1 :(得分:8)

如果您将模式存储在一个文件中,每行一个,您可以使用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.)

编辑2018:

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

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

答案 2 :(得分:1)

bruchowski's answer外,您还可以使用:

grep -i -e "hello" -e "world" -e "tester" abc.log

OR

grep 'hello\|world\|tester' abc.log

OR

egrep 'hello|world|tester' abc.log