在所有机器上使用 Grep "-C" 命令
Grep "-C" command on all machine
我正在使用grep -C 1 "matching string" "xty.pom"
这适用于 Linux 台机器,但相同的代码不适用于 AIX、SunOS_x64、HPUX 等其他平台。
是否有任何替代方案可以使相同的代码逻辑适用于所有平台?
这将像 grep -C 1 "matching string"
一样工作,但应该在不支持 grep 的 -C
选项的平台上工作:
awk '/matching string/{print last; f=2} f{print; f--} {last=[=10=]}' File
工作原理
/matching string/{print last; f=2}
如果当前行与正则表达式 matching string
匹配,则打印上一行(保存在 last
中)并将 f
设置为 2。
f{print; f--}
如果 f
非零,则打印当前行并递减 f
。
last=[=22=]
设置last
等于当前行的内容。
改进
通过一些小改动,我们可以更好地处理重叠匹配:
awk '/a/{if (NR>1 && !f)print last; f=3} f>1{print} f{f--} {last=[=11=]}'
作为重叠匹配的输出示例:
$ printf '%s\n' a a b | awk '/a/{if (NR>1 && !f)print last; f=3} f>1{print} f{f--} {last=[=12=]}'
a
a
b
Sun/Solaris
Sun/Solaris 上的原生 awk 是臭名昭著的漏洞百出。改用 nawk
或
更好的是 /usr/xpg4/bin/awk
或 /usr/xpg6/bin/awk
我正在使用grep -C 1 "matching string" "xty.pom"
这适用于 Linux 台机器,但相同的代码不适用于 AIX、SunOS_x64、HPUX 等其他平台。
是否有任何替代方案可以使相同的代码逻辑适用于所有平台?
这将像 grep -C 1 "matching string"
一样工作,但应该在不支持 grep 的 -C
选项的平台上工作:
awk '/matching string/{print last; f=2} f{print; f--} {last=[=10=]}' File
工作原理
/matching string/{print last; f=2}
如果当前行与正则表达式
matching string
匹配,则打印上一行(保存在last
中)并将f
设置为 2。f{print; f--}
如果
f
非零,则打印当前行并递减f
。last=[=22=]
设置
last
等于当前行的内容。
改进
通过一些小改动,我们可以更好地处理重叠匹配:
awk '/a/{if (NR>1 && !f)print last; f=3} f>1{print} f{f--} {last=[=11=]}'
作为重叠匹配的输出示例:
$ printf '%s\n' a a b | awk '/a/{if (NR>1 && !f)print last; f=3} f>1{print} f{f--} {last=[=12=]}'
a
a
b
Sun/Solaris
Sun/Solaris 上的原生 awk 是臭名昭著的漏洞百出。改用 nawk
或
更好的是 /usr/xpg4/bin/awk
或 /usr/xpg6/bin/awk