如何使用 grep 来获取两行不同的数据

如何使用 grep 来获取两行不同的数据

当两个不同的短语位于两行时,如何使用单个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 这些结果。除非两个词恰好出现在同一行,否则上面的三行将被缩减为两行。

相关内容