当两个不同的短语位于两行时,如何使用单个grep
命令来搜索它们?
例如
第 1 行:这是糖果。
第二行:柠檬。
我用过这个,但没有结果
grep "sweet.*lemon" file_type
答案1
要使用grep
两条不同的线,请搜索两种模式
$ grep -e sweet -e lemon file_type
This is a sweet
lemon.
或者使用交替
$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.
要获取模式后的下一行,可以使用 context 选项
$ grep -A1 sweet file_type
This is a sweet
lemon.
但如果你明确地搜索多行模式,这很棘手,因为grep
要按线思考……. 你.*
会捕捉到“甜”和“柠檬”之间的一切在线上。我们可以在下一行-P
使用\n
匹配换行符并通过 分隔grep
文件为空来获取“lemon” -z
:
$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.
笔记:
-E
使用扩展正则表达式(使用|
字符进行替换而无需转义)-An
在模式后打印附加行,其中 n 是要打印的尾随行数-P
使用 perl 风格的正则表达式(“实验性”grep
- 安装pcregrep
以获得更好的 perl 正则表达式支持)-z
使用空字符作为分隔符(在这种情况下只是假装,但grep
我们会相信我们的话)-o
只打印匹配的部分
答案2
像这样:
grep "sweet\|lemon"
答案3
这是一个非常有效的方法,可以找出两条看起来相邻的线。我已经将其设计成线的顺序无关紧要,但如果确实有关系,可以轻松调整。
首先我创建了一个包含以下行的文件:
dog
fish
elephant
wombat
cat
pickle
anglepoise lamp
然后我进行了以下测试来演示如何使用 grep (包括 -A 和 -B)来提取出有问题的两行。
2020-08-14 02:08:45 → touch Desktop/test/file.txt
2020-08-14 10:01:03 → grep -A1 -B1 cat Desktop/test/file.txt
wombat
cat
pickle
2020-08-14 10:01:10 → grep -A1 -B1 cat Desktop/test/file.txt | grep -A1 -B1 wombat
wombat
cat
2020-08-14 10:01:27 → grep -A1 -B1 cat Desktop/test/file.txt | grep -A1 -B1 pickle
cat
pickle
2020-08-14 10:01:49 →
发生了什么?首先,A 和 B 表示之后和之前。因此,我们 grep 查找我们的术语 (cat),并在响应中包含目标行之后的一行和目标行之前的一行。这将产生两行或三行,具体取决于目标行是第一行还是最后一行(2 行),或者目标行是否在文件中的其他地方。(显然,只有一行的文件只能返回一行。)
然后我们使用同样的方法用第二个搜索词来 grep 这些结果。除非两个词恰好出现在同一行,否则上面的三行将被缩减为两行。