用于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意味着读取下一行并在第一个模式处重新开始评估。