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(或其他语言)脚本,尽管这可能会导致重叠模式出现问题.除了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)
| 归档时间: |
|
| 查看次数: |
47745 次 |
| 最近记录: |