【问题标题】:How to echo text and have output from a command be sent to a file in parallel如何回显文本并将命令的输出并行发送到文件
【发布时间】:2011-04-23 13:54:53
【问题描述】:

我想回显文本并远程 ping 计算机并将输出发送到日志文件。我还需要并行执行此操作,但我在如何将输出发送到日志文件时遇到了一些问题。

我希望输出看起来像: 主持人 |主机到 | ping 命令的结果

但由于我将此作为后台进程运行,因此它正在输出: 主机主机到主机主机到 rtt rtt rtt 等等……

有没有办法让它成为一个后台进程,但让它成为该进程的一部分,所以日志文件不会乱序?

这是我的脚本,提前致谢!

 for host in `cat data/ips.txt`; do 
 echo -n "$host ";
 for hostTo in `cat data/ips.txt`; do
 {
     echo -n "$host $hostTo " >> logs/$host.log;
    (ssh -n -o StrictHostKeyChecking=no -o ConnectTimeout=1 -T username@$host ping -c 10 $hostTo | tail -1 >> logs/$host.log) &

 };
done; 
done

【问题讨论】:

标签: bash unix scripting shell


【解决方案1】:

使用awk 可以做到这一点。您基本上要问的是如何同时打印出主机和结果。

即。删除带有 echo 的行并更改以下内容:

ssh .... ping -c 10 $hostTo | awk -v from=$host -v to=$hostTo 'END {print from, to, $0}' >> logs/${host}.log

请注意,tail 也在 awk 内部有效地完成。在 awk 中包含 shell var 往往是一个 PITA,也许有一种更简单的方法可以在没有所有转义和引号的情况下做到这一点。 [更新:在 awk 中分配 var]

PS。您的问题的标题有点不清楚,听起来您确实想将程序输出同时通过管道传输到显示器和文件。

【讨论】:

  • awk -v awkvar=$shellvar 'END {printf awkvar}'
  • 我在 awk 部分中使用 "'"$host"'" 解决了这个问题,但这似乎是同一件事,只是方式不同。谢谢!
  • @Isawpalmetto:使用变量传递而不是复杂的引用更具可读性和可维护性。
猜你喜欢
  • 2013-06-28
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2010-10-02
  • 2015-08-18
相关资源
最近更新 更多