【问题标题】:Grep "-C" command on all machine所有机器上的 Grep“-C”命令
【发布时间】:2016-12-24 23:50:30
【问题描述】:

我正在使用grep -C 1 "matching string" "xty.pom"

这适用于 Linux 机器,但相同的代码不适用于 AIX、SunOS_x64、HPUX 等其他平台。

是否有任何替代方案,以便相同的代码逻辑适用于所有平台?

【问题讨论】:

  • edit 您的问题显示minimal reproducible example,包括简洁、可测试的样本输入、预期输出以及您迄今为止尝试过的内容,以便我们为您提供帮助。

标签: linux grep aix hp-ux sunos


【解决方案1】:

这将像 grep -C 1 "matching string" 一样工作,但应该在不支持 grep 的 -C 选项的平台上工作:

awk '/matching string/{print last; f=2} f{print; f--} {last=$0}' File

工作原理

  • /matching string/{print last; f=2}

    如果当前行匹配正则表达式matching string,则打印上一行(保存在last 中)并将f 设置为2。

  • f{print; f--}

    如果f 不为零,则打印当前行并递减f

  • last=$0

    设置last等于当前行的内容。

改进

通过一些小的改动,我们可以更好地处理重叠匹配:

awk '/a/{if (NR>1 && !f)print last; f=3} f>1{print} f{f--} {last=$0}'

作为具有重叠匹配的输出示例:

$ printf '%s\n'   a a b |  awk '/a/{if (NR>1 && !f)print last; f=3} f>1{print} f{f--} {last=$0}'
a
a
b

太阳/Solaris

众所周知,Sun/Solaris 上的本机 awk 充满了错误。改用nawk 或 更好的是/usr/xpg4/bin/awk/usr/xpg6/bin/awk

【讨论】:

  • 只有当正则表达式没有出现在文件开头或连续行上时,awk 命令才会表现得像grep -C 1。尝试使用 grep -C 1 和 awk 命令在包含 a\na\nb\n (其中 \n 是文字换行符)的文件中搜索 a 并注意 grep 按原样输出文件(a\na\nb\n),而 awk输出\na\na\na\nb\n.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2018-11-03
  • 2020-10-26
  • 2013-08-23
  • 2021-02-02
  • 1970-01-01
相关资源
最近更新 更多