[英]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-quote
和double-quote
。 "
)中扩展变量( words beginning with $
)。 '
)阻止Bash查找内部变量。 user131527
和psj
建议的那样,使用\\
转义$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.