如何仅在pattern1和pattern2在连续行中匹配时grep
我有一个如下的文件:如何仅在pattern1和pattern2在连续行中匹配时grep,grep,Grep,我有一个如下的文件: city-italy good food bad climate - city-india bad food normal climate - city-brussel normal dressing stylish cookings good food - 问题-我想grep城市和食品,因为“食品”是“坏的” 例如— 对于上面的问题,我需要一个grep命令来得到如下的答案 city-india bad food 请帮助我,如果模式1和模式2并行成功,我将如何使它们变灰
city-italy
good food
bad climate
-
city-india
bad food
normal climate
-
city-brussel
normal dressing
stylish cookings
good food
-
问题-我想grep城市
和食品
,因为“食品”是“坏的”
例如—
对于上面的问题,我需要一个grep命令来得到如下的答案
city-india
bad food
请帮助我,如果模式1和模式2并行成功,我将如何使它们变灰
我的意思是这两种模式都应该匹配,并且应该在下面的行中grep。你可以使用管道--
grep-A1城市| grep-B1“坏食物”
或cat filename | grep-A1城市| grep-B1“坏食物”
(或管道的任何其他流源)使用gnu awk
(到期日)
另一条awk线:
kent$ awk 'BEGIN{FS=OFS="\n";RS="-"FS}/bad food/{print $1,$2}' file
city-india
bad food
如果保证城市名称在食品质量之前(允许在两者之间提供任何其他信息):
它将每个城市的名称保留在保留缓冲区中,并在匹配坏食物时打印最后的城市名称。如果顺序得到保证,您可以直接使用命令
grep
,或:
grep -e "city" -e "food" FILE_INPUT
然后,希望这座城市在接下来的几天里也能看到它的美食特色
结果如下:
city-italy
good food
city-india
bad food
city-brussel
good food
您可以更改模式以获得更过滤的结果。我知道这是一个老问题,但这里有一个“可靠”的替代方案(因为我喜欢):
解释
grep-x-e'city-.'-e'good food'-e'bad food'-e'-'
:只保留包含“city line”、“food line”(好的或坏的)或“separator line”(我知道food line表达式可能更好),grep的-x
参数将使其仅在整行与给定表达式匹配时返回一行(顺便说一句,此第一阶段使整个管道不会阻塞在不同大小的“寄存器”上)tr\\n\|
:将换行符转换为管道(您可以使用原始文件中未出现的任何字符,管道工作,冒号也工作,您明白了)sed-e的/|-|/\n/g'
:用换行符替换-|-|
字符串(这是我们知道的“寄存器”结束的地方,因为我们只保留了我们感兴趣的基准和分隔符,我们知道现在我们的每个“寄存器”都在一行中,它们的字段由管道分隔)grep-xe'[^ |]\+\+[^ |]\+'
:只保留恰好包含两个字段(即城市和食品字段)的行grep-e'| bad food$'
:仅保留以|bad food
结尾的行tr\|\\n
:将管道重新转换为新线(注意,这里的内容只是为了使输出符合问题的规格,我认为这不是真正需要的,也不是首选)city-italy
good food
-
city-india
bad food
-
city-brussel
good food
-
在tr\\n\|
之后:
city-italy|good food|-|city-india|bad food|-|city-brussel|good food|-|
在sed-e的/|-|/\n/g'
之后:
city-italy|good food
city-india|bad food
city-brussel|good food
在grep-xe'[^ |]\+\+.[^ |]\+'
之后:同上,因为在给定的示例中,我们没有没有没有没有“食物线”的“城市线”,也没有包含两条“城市线”和一条“食物线”的寄存器,也没有包含一条“城市线”和两条“食物线”的寄存器,或者……你明白了
在grep-e'|坏食物$'之后
:
city-india|bad food
在tr\|\\n
之后:
city-india
bad food
为什么这更“健壮”?
输入文件基本上由不同的“寄存器”组成,每个寄存器包含可变数量的“字段”,但我们发现它们不是“水平”格式,而是“垂直”格式,即每行一个字段,单独的-
分隔整个寄存器
上面的管道支持每个寄存器中的任意数量的字段,它仅假设:
-
分隔city-*
好食品
,要么是坏食品
sed
或awk
来拯救我自己的生命,而且经常发现这样的管道有助于理解文件是如何被过滤和转换的
总而言之,这只是一个品味问题。很好的一个,展示了两种可能性。注意,您可以避免使用
grep-A1 city filename
的cat
部分。
city-italy|good food
city-india|bad food
city-brussel|good food
city-india|bad food
city-india
bad food