在所有机器上使用 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