使用awk从特定行获取第n个字段

时间:2014-05-07 19:25:51

标签: bash awk centos

我写了一个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上试用它时,这就是我得到的。

2 个答案:

答案 0 :(得分:2)

你可以说:

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")

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

答案 1 :(得分:2)

作为替代方案,您可以使用grep -P来获取该版本字符串:

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