【问题标题】:Using awk to get nth field from a particular line使用 awk 从特定行获取第 n 个字段
【发布时间】:2014-06-24 22:45:40
【问题描述】:

我编写了一个 bash 脚本,它应该获取 ghostscript 的版本号。代码如下所示:

local str=$(gs -v)
local gs_version=''
if [ -n "$str" ] ; then
  gs_version=`awk -F'|' 'Ghostscript/ {version=$3; print version}' $str`
fi
echo " version: $gs_version"

gs -v 的结果是:

GPL Ghostscript 8.70 (2009-07-31)
Copyright (C) 2009 Artifex Software, Inc.  All rights reserved.

脚本正在寻找单词 Ghostscript 并尝试提取第三个单词,即 8.70。这是我的目标。

我不是 awk 专家,但是当我运行此代码时,我收到以下错误:

awk: Ghostscript/ {version=$3; print version}
awk:              ^ syntax error

我想我一定是瞎了眼,因为我看不出有什么问题。我以为我可以在 Ubuntu 上使用它,但是当我在 CentOS 6 上尝试它时,这就是我得到的。

【问题讨论】:

    标签: bash awk centos


    【解决方案1】:

    你可以说:

    awk '/Ghostscript/{print $3}' inputfile
    

    从包含 Ghostscript 的行中获取第三个字段。

    当你说:

    gs_version=`awk -F'|' 'Ghostscript/ {version=$3; print version}' $str`
    

    有:

    • 在 Ghostscript 之前缺少 /
    • 此外,由于您希望awk 从字符串中读取,您需要使用herestring。
    • 默认情况下,字段由空格分隔,因此您不需要提供一个(但不确定您为什么使用|
    gs_version=$(awk '/Ghostscript/ {version=$3; print version}' <<< "$str")
    

    虽然有更简单的方法来获取版本信息。

    【讨论】:

    • 将其扩展到您的用例,gs_version=$(gs -v | awk -F'|' '/Ghostscript/ {print $3}')
    • 感谢您指出我的错误并提供更简单的方法来完成同样的事情。
    【解决方案2】:

    您也可以使用grep -P 来获取该版本字符串:

    gs -v | grep -oP '(?<=Ghostscript )\S+'
    8.70
    

    【讨论】:

    • 感谢您指出这一点。我会记住下次我需要这样做的时候。
    猜你喜欢
    • 2015-09-13
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多