使用grep 打印匹配的行和以下行:
$ egrep -w -A1 "^1234" filename
1234 otherstuff
rightsecondline
使用awk实现和上面一样†:
$ 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实现和上面一样†:
$ 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"{...} 是一个pattern/action rule,这意味着如果第一列等于文本1234 然后执行...,pr_after{...} 意味着如果变量pr_after 设置为某个非零非空值然后执行 ...,getline 表示 读取下一行并继续执行 getline 之后的语句,而 @ 987654323@ 表示读取下一行并在第一个模式处重新开始评估。