在 for 循环中使用 awk 的 Bash 脚本

发布于 2024-09-25 11:28:43 字数 204 浏览 3 评论 0原文

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

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

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

Say I want to print 2nd field in the log file on a couple remote host. In above script, print $2 doesn't work. How can I fix this? Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

愿得七秒忆 2024-10-02 11:28:43

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

Depending on the number of shell expansions and type of quoting multiple backslash escapes are needed:

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 (!) 

As a trick you can put a space between the dollar sign and the two to prevent all $ expansion. Awk will still glue it together:

  CFG=`ssh $i "cat log.txt|awk '{print $ 2}'"`
别低头,皇冠会掉 2024-10-02 11:28:43

尝试

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

try

for i in $LIST
do
  ssh $i "cat log.txt|awk '{print \$2}'"
done
日记撕了你也走了 2024-10-02 11:28:43

确保您从 shell 中转义 $2 - 您现在最终发送的 ssh 命令如下所示:ssh listvalue cat log.txt|awk '{print }'< /代码>

Make sure you're escaping the $2 from the shell - the ssh command you end up sending right now is something like this: ssh listvalue cat log.txt|awk '{print }'

柏林苍穹下 2024-10-02 11:28:43
for server in $LIST
do
   ssh "$server" 'awk "{print $2}" log.txt'
done
  • 仔细观察单引号和双引号的位置。
  • Bash 尝试在双引号 (") 内扩展变量(以 $ 开头的单词)。
  • 单引号 (') 会阻止 Bash 查找 内部变量。
  • 对于 >\ 也应该可以工作(取决于 Bash 的配置方式)。
for server in $LIST
do
   ssh "$server" 'awk "{print $2}" log.txt'
done
  • Carefully watch the location of the single-quote and the double-quote.
  • Bash tries to expand variables (words beginning with $) inside double-quote (").
  • Single-quote (') stops Bash from looking for variables inside.
  • As user131527 and psj suggested, escaping $2 with \ should also have worked (depending on how your Bash is configured).
请你别敷衍 2024-10-02 11:28:43

我能够将 awk 放入双 for 循环

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

I was able to put awk in a double for loop

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

忘年祭陌 2024-10-02 11:28:43

失去猫。没用的..

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

Lose the cat. Its useless..

for server in $LIST
do
  ssh "$server" "awk '{print \$2}' log.txt"
don
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文