如何在日志文件中使用grep查找包含特定单词的行?

23

我有一个巨大的日志文件,我想要扫描它以查找特定的单词。一般来说,我会有几个单词需要在我的大型日志文件上进行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单词,因此任何包含hello单词的行,我都会将其打印出来,类似地,也会用world和tester进行相同的操作。

我试图使其尽可能通用,以便只需将我的单词列表添加到数据变量中,而不需要更改 grepping 日志的实际逻辑。

3个回答

32

我会使用正则表达式,就像这样:

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

非常感谢您,bruchowski。它运行得很好。在我的情况下,我可以有超过三个模式,所以我正在考虑将其存储在变量中,就像我在问题中展示的那样,然后拆分该变量并开始进行grep,或者也可以将其存储在文件中。您认为在shell脚本中使其通用的更好方法是什么? - john
@user2809564,由于命令行参数的长度存在限制,这种方法最终会失败,而文件方式则不会。不过我不确定你的数据集是否如此庞大。 - o11c
@user2809564 任何一种方法都是不错的选择。如果您不打算搜索太多字符串,那么我可能会选择使用这种内联方法,并在“|”上连接一个术语数组,否则@o11c的答案也会适合您。 - bruchowski

13
如果您将模式存储在文件中,每行一个模式,您可以使用grep -f file-with-patterns file-to-search.log进行搜索。
来自man手册的说明:
   -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(或其他语言)脚本,尽管这可能会在重叠模式方面存在问题。

感谢o11c。在我的情况下,模式可能会增长很多,因此文件方法是好的,但我想在其中添加一件事 - 如果行包含特定单词,则不要打印出该行。如何使用您当前的方法来实现这一点? - john
@user2809564 把第一个 grep 的输出通过 grep -v wordtoexclude (或 -e-f 等) 进行过滤。 - o11c
谢谢。可能我也可以有多个要排除的模式,那么有没有办法制作一个包含要包含和要排除的模式的文件,然后使用这个文件来进行grep? - john
@user2809564,您需要为包含和排除创建不同的文件: grep -f include-file search-files... | grep -v exclude-file - o11c
明白了。最后一个问题,如果我要查找包含单词“hello”的行,但要排除的单词是“test”,那么如果包含“test”的行也同时包含“hello”,那么该行会被排除,对吗? - john

6

除了 bruchowski's answer,你还可以使用:

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

或者

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

或者

egrep 'hello|world|tester' abc.log

grep -Rie "80" ./ 帮助我从当前文件夹递归查找。 - Damodar Bashyal
grep -Rie "listen.*80" ./ 作为正则表达式搜索工作得很好。太棒了! - Damodar Bashyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接