使用awk for for循环的Bash脚本

时间:2010-09-30 21:57:12

标签: bash awk

for i in $LIST
do
  CFG=`ssh $i "cat log.txt|awk '{print $2}'"`
  for j in $CFG
  do
    echo $j
  done
done

假设我想在一对远程主机上的日志文件中打印第二个字段。在上面的脚本中,打印$ 2不起作用。我怎样才能解决这个问题?感谢。

6 个答案:

答案 0 :(得分:4)

根据shell扩展的数量和引用的类型,需要多个反斜杠转义:

awk '{ print $2 }' log.txt # none
ssh $server "awk '{ print \$2 }' log.txt" # one
CFG=`ssh $server "awk '{ print \\$2 }' log.txt"` # two
CFG=$(ssh $server "awk '{ print \$2 }' log.txt") # one (!) 

作为一种技巧,您可以在美元符号和两者之间放置一个空格以防止所有$扩展。 Awk仍将它粘在一起:

  CFG=`ssh $i "cat log.txt|awk '{print $ 2}'"`

答案 1 :(得分:3)

for i in $LIST
do
  ssh $i "cat log.txt|awk '{print \$2}'"
done

答案 2 :(得分:1)

确保您从shell中转出$2 - 您现在最终发送的ssh命令是这样的:ssh listvalue cat log.txt|awk '{print }'

答案 3 :(得分:1)

for server in $LIST
do
   ssh "$server" 'awk "{print $2}" log.txt'
done
  • 仔细观察single-quotedouble-quote的位置。
  • Bash尝试在双引号(words beginning with $)内扩展变量(")。
  • 单引号(')阻止Bash查找内部变量。
  • 建议 user131527 psj 时,使用$2转义\也应该有效(取决于你的Bash是如何配置的。)

答案 4 :(得分:0)

失去了猫。它没用..

for server in $LIST
do
  ssh "$server" "awk '{print \$2}' log.txt"
don

答案 5 :(得分:0)

我能够将awk放入双循环中

for i in 1 2 3 4;do for j in $\(ls | awk -v I=$i '{print $I}'); echo $j done; done