如何将grep用于2条不同的线


Answers:


20

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文件为空,用下划线来获取下一行的“柠檬” -z

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

笔记:

  • -E使用扩展的正则表达式(在|无需转义的情况下使用字符进行替换)
  • -An 在模式之后打印其他行,其中n是要打印的尾随行数
  • -P使用Perl样式的正则表达式(grep安装时pcregrep改为“ experimental”,以便更好地支持perl regex)
  • -z使用空字符作为分隔符(在这种情况下只是假装,但grep我们会相信)
  • -o 只打印匹配的部分

尽管该grep -zP命令在这种特定情况下(由两行组成的文件)可以工作,但通常会将任何由换行符分隔的普通文件视为单行,因此可以转储整个文件的内容(如果某处有匹配项)或者什么都没有; 通常那不是人们用grep的。
Marc van Leeuwen

是的,这仅适用于-o...编辑...
Zanna

如果在其他发行版上尝试使用它,您可能会遇到以下问题:grep: The -P and -z options cannot be combined-例如RHEL上的grep(GNU grep)2.5.1
Jason Pyeron

6

像这样:

grep "sweet\|lemon"

|“柠檬香”抱歉,但是这将精确匹配
αғsнιη

4
@KasiyA这条线工作正常。grep在“标准模式”默认的作品,其中“特殊字符”像|+*按字面解释,除非他们用反斜杠掩盖。例如,参见此答案。要使用您可能习惯的方式,需要屏蔽“特殊字符”以进行字面解释,您需要切换到“扩展模式”(grep -E)。也许madneon可以更详细一点上他的答案,例如什么有机磷农药尝试具有匹配?
亨宁·科克贝克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.