繁体   English   中英

使用awk for for循环的Bash脚本

[英]Bash script using awk in for loop

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

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

根据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}'"`

尝试

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

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

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

失去了猫。 没用的..

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

我能够将awk放入双循环中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM