for i in $LIST
do
CFG=`ssh $i "cat log.txt|awk '{print $2}'"`
for j in $CFG
do
echo $j
done
done
假设我想在一对远程主机上的日志文件中打印第二个字段。在上面的脚本中,打印$ 2不起作用。我怎样才能解决这个问题?感谢。
答案 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-quote
和double-quote
的位置。 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