用于grep
打印匹配的行和以下行:
$ egrep -w -A1 "^1234" filename
1234 otherstuff
rightsecondline
用于awk
实现与上述相同的†</sup>:
$ awk '$1=="1234"{print;getline;print}' filename
1234 otherstuff
rightsecondline
用于grep
仅打印匹配后的行(之前<
的通知filename
):
$ grep -w -H --label=dummy -A1 '^1234' <filename | sed -ne 's#^dummy-##p'
rightsecondline
用于awk
实现与上述相同的†</sup>:
$ awk '$1=="1234"{getline;print}' filename
rightsecondline
†前提是没有连续的两行包含搜索词,并且文件中的最后一行不包含搜索词
如果您希望两个或多个连续行包含搜索词,例如
4567 otherstuff 1234
wrongsecondline
1234 otherstuff once
1234 otherstuff again
rightsecondline
...然后awk
有状态地使用以实现与以下相同的输出grep -A1
:
$ awk 'pr_after{print;pr_after=0}$1=="1234"{print;pr_after=1}' filename
1234 otherstuff once
1234 otherstuff again
rightsecondline
...并使用awk
有状态地始终打印匹配后的行,即使该行本身就是匹配:
$ awk 'pr_after{print;pr_after=0}$1=="1234"{pr_after=1}' filename
1234 otherstuff again
rightsecondline
...或使用awk
有状态仅打印紧跟在一个或多个匹配行之后的非匹配行,实现与grep -H | sed
上述相同的输出:
$ awk '$1=="1234"{pr_after=1;next}pr_after{print;pr_after=0}' filename
rightsecondline
在上面的示例中,$1=="1234"{...}
是一个模式/动作规则,表示如果第一列等于文本,1234
则执行...,pr_after{...}
表示如果变量pr_after
设置为某个非零非空值,则执行...,getline
表示读取下一个line 并继续执行 getline 之后的语句,而next
意味着读取下一行并在第一个模式处重新开始评估。