【问题标题】:"awk" Command Behaves Differently On SuSE 11 vs. Solaris 10“awk”命令在 SuSE 11 和 Solaris 10 上的行为不同
【发布时间】:2017-06-11 20:04:50
【问题描述】:

朋友们,

我正在尝试在 ksh 脚本中提取以下路径的最后一部分:

TOOL_HOME=/export/fapps/mytool/mytool-V2-3-4

我想从上面提取版本号(即 2-3-4)。

awk 在 SuSE 上运行良好:

echo $TOOL_HOME | awk -F'mytool-V' '{print $2}'
#2-3-4

但是,在 Solaris 10 上,它会生成以下内容:

#ytool

所以在 Solaris 上,awk 会忽略 -F'mytool-V' 中第一个字符之后的所有内容

我应该怎么做才能在两个操作系统上获得相同的输出?

【问题讨论】:

  • 输出中的# 符号来自哪里?它在输入中不存在,您也没有在print 语句中添加它,那么为什么它存在于您的输出中?您在 Solaris 上执行哪个 awk - /bin/awk 或 /bin/nawk 或 /usr/xpg4/bin/awk? (提示 - 您应该使用列表中的最后一个,因为第一个是旧的、损坏的 awk,而第二个只是 POSIX 之前的版本)。
  • 我刚刚添加了 # 以表明这是我的输出,我实际上并没有在屏幕上看到它。关于哪个awk,让我检查并返回
  • 不要添加不存在的东西。这就像把你的车带到修理工那里诊断你的车是否向左拉,并在你把它展示给他询问他认为可能是什么问题之前刺破你的左前轮胎。
  • 对于sed 恕我直言来说,这似乎是一个足够简单的工作。
  • 返回@EdMorton 的评论并确保您使用的是更高版本的awk。旧的、损坏的 awk 只使用一个字符作为字段分隔符(在您的情况下为 m)并忽略您所看到的其余部分。

标签: awk ksh behavior suse solaris-10


【解决方案1】:

在 Solaris 上使用 /usr/xpg4/bin/awk,而不是 /bin/awk(又名“旧的、损坏的 awk”)。

【讨论】:

    【解决方案2】:

    Solaris awk 坏了...

    $ echo "$TOOL_HOME" | awk '{sub(/.*mytool-V/,"")}1'
    2-3-4
    

    或者干脆用sed

    $ echo "$TOOL_HOME" | sed 's/.*mytool-V//'
    2-3-4
    

    【讨论】:

    • awk 在 Solaris 上没有损坏。 Solaris 上的 /bin/awk 是旧的,损坏的 awk,因此不应该使用,但是 /bin/nawk 和 /usr/xpg4/bin/awk 都没有损坏,实际上 /usr/xpg4/bin/awk 甚至非常接近 POSIX 兼容。
    【解决方案3】:

    无需使用awk 或任何其他外部程序。 ksh 可以做到:

    echo ${TOOL_HOME##*mytool-V}
    

    【讨论】:

    • Michael,您的代码仍然返回整个路径,而不仅仅是最后一部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2020-06-19
    相关资源
    最近更新 更多