![如何使 awk 在有条件的情况下打印文件文本中的多行匹配字符串?](https://linux22.com/image/175256/%E5%A6%82%E4%BD%95%E4%BD%BF%20awk%20%E5%9C%A8%E6%9C%89%E6%9D%A1%E4%BB%B6%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E6%89%93%E5%8D%B0%E6%96%87%E4%BB%B6%E6%96%87%E6%9C%AC%E4%B8%AD%E7%9A%84%E5%A4%9A%E8%A1%8C%E5%8C%B9%E9%85%8D%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
如何打印满足条件的多种图案的线条?
例如对于输入文件
部分包含以下内容:
ID : 1
Status : Ok
Name : Lulu
Age : 18
State : US
ID : 2
Status : Ok
Name : Master Yi
Age : 22
State : UK
ID : 3
Status : Ok
Name : Garen
Age : 20
State : CA
------------
Codition : IF Age == 20 | print
----------
ID : 3
Status : Ok
Name : Garen
Age : 20
State : CA
请帮忙
谢谢
答案1
如果您的文件确实如您所示,并且每条记录之间有 4 个空行,每条记录之间有 3 个空行,那么您可以执行以下操作:
$ awk -v RS='\n\n\n\n' '/Age : 20\n/' file
ID : 3
Status : Ok
Name : Garen
Age : 20
State : CA
您还没有澄清这一点,但我怀疑额外的空行实际上并不是文件的一部分,而只是问题格式的假象,因此记录的每一行之间只有一个空行,并且记录之间只有两个空行每条记录。如果是这样,您的输入文件如下所示:
ID : 1
Status : Ok
Name : Lulu
Age : 18
State : US
ID : 2
Status : Ok
Name : Master Yi
Age : 22
State : UK
ID : 3
Status : Ok
Name : Garen
Age : 20
State : CA
如果你的文件确实是这样的,那么你可以这样做:
$ awk -v RS= '/Age : 20\n/' file
ID : 3
Status : Ok
Name : Garen
Age : 20
State : CA
答案2
以下方法首先创建一个数组以将字段的标签(名称)映射到其值,让您可以执行当前想要的操作,并在将来轻松地增强它以测试复合条件、打印选择字段、以不同顺序打印字段或者对类型数据执行任何其他操作tag:value
:
$ cat tst.awk
BEGIN { OFS=" : " }
!NF { next }
{
tag = val = $0
sub(/ *:.*/,"",tag)
sub(/[^:]+ *: */,"",val)
if ( !(tag in tag2val) ) {
tags[++numTags] = tag
}
tag2val[tag] = val
}
tag == "State" {
if ( tag2val["Age"] == 20 ) {
for (tagNr=1; tagNr<=numTags; tagNr++) {
tag = tags[tagNr]
val = tag2val[tag]
print tag, val
}
print ""
}
delete tag2val
numTags = 0
}
。
$ awk -f tst.awk file
ID : 3
Status : Ok
Name : Garen
Age : 20
State : CA