【问题标题】:Shell awk command with FS带 FS 的 Shell awk 命令
【发布时间】:2016-12-07 11:35:52
【问题描述】:

我创建了一个带有 awk 命令的脚本,内容如下:

myVar=$(awk -v FS="HAMMER=" 'NF>1{print $2}' TEST.properties)
echo "Appliances="$myVar

文件TEST.properties 包含以下内容:

...
HAMMER=foo1,foo2
JACKHAMMER=foo3
...

以上命令返回

foo1,foo2
foo3

我应该如何修改命令以仅查找 HAMMER 而不是包含 HAMMER 的每个单词?

【问题讨论】:

  • 不要使用诸如将搜索字符串设置为字段分隔符之类的技巧,使用 FS 作为字段分隔符。试试awk -vFS="=" '$1=="HAMMER"{print $2}' file
  • 总是 key=value 吗?和HAMMER 出现在键中?
  • 是键=值。锤子是关键。感谢您的建议!
  • 如果文件是无害的,那么获取它并打印变量呢? (source file; echo "$HAMMER" )
  • 当我将 '$1=="HAMMER" 替换为 '$1=="$SomeVar" 时,我什么也得不到。我知道变量有一个值

标签: linux bash shell awk


【解决方案1】:

在您的字段分隔符FS 中使用^ 行的开头:

awk -v FS="^HAMMER=" 'NF>1{print $2}'

但如果你有 key=value 构造,你最好使用:

awk -v FS='[=,]' '$1=="HAMMER"{for(i=2;i<=NF;i++} print $i}'

字段分隔符设置为=,。如果第一个参数是您的关键字,则打印该行的所有其他参数。

【讨论】:

  • 当我用变量替换 HAMMER 时,我没有在命令中得到变量值。前任。 awk -v FS='[=,]' '$1=="${SOMEVAR}"{for(i=2;i
  • 这是单引号 awk 脚本的结果。您可以添加另一个选项-v var="$SOMEVAR" 并将脚本更改为$1==var {...}
  • 这样吗? awk -v var="$SOMEVAR" FS='[=,]' '$1==var{for(i=2;i
  • 像这样:awk -v var="$SOMEVAR" -v FS='[=,]' '$1==var{for(i=2;i&lt;=NF;i++) print $i}'
【解决方案2】:

要么:

awk -F'=' '$1=="HAMMER"{print $2}' file

或:

grep -oP '(?<=^HAMMER=).*' file

【讨论】:

    【解决方案3】:
    awk -F= '/^HAMMER=/ { print $2 }' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 2013-11-15
      相关资源
      最近更新 更多