【问题标题】:Pipes with while loops within Parentheses括号内带有 while 循环的管道
【发布时间】:2014-08-06 23:48:57
【问题描述】:

我要问一个关于括号内带有while循环的管道的结构。

想象一下我有一个这样的脚本:

#!/bin/bash

<FirstCommand> | (while read var1; do out=`echo $var1 | <command>` \
                  <sth with $out> done; awk -v RS="" '{print $5,$18,$20}' OtherFile |  awk 'NF==3{print}{}' | awk '{gsub (/<blank>/,""); print}' > file.txt \
                  while read var2 var3 var4; do <sth> done < file.txt)

关键是我的脚本在第一个 while 循环结束之前工作正常。但是第二个有问题。

我的问题:

FirstCommand 的输出是否同时重定向到两个 while 循环?

关于FirstCommand

这是一个生成一些文本的命令,我想将其输出重定向到 while 循环运行时。

更新

的输出附加到awk 正在使用的OtheFile

谢谢

【问题讨论】:

  • awk 在哪里获取输入? awk 永远不会看到 FirstCommand 生成的任何文本,但会在尝试读取其标准输入时立即终止,因为第一个 while 循环已经消耗了所有数据。
  • 我把 awk 命令@William Pursell
  • 您是否要让第二个 while 循环先读取 awk 的输出,然后再读取 FirstCommand 的输出?
  • 我希望在 FirstCommand 运行时看到 的输出到 awk,然后在 awk 生成输出到 file.txt 时 while loop 做一些事情
  • 所以你想让FirstCommand的输出进入第一个while循环和awk,而awk的输出进入第二个while循环?然后:firstcommand | while ...; do ... done &amp; firstcommand | awk | while ... do; ... done。如果 firstcommand 很昂贵,请先运行它并将其输出存储在一个文件中。

标签: bash redirect while-loop pipe


【解决方案1】:

第一个命令的输出被发送到包含两个循环的 shell 的输入。第一个循环消耗所有数据。第二个循环的输入是文件 file.txt(awk 的输出。除非这里没有显示某些原因,否则您最好将 awk 直接通过管道传递到第二个 while 循环。)

【讨论】:

  • 好的,谢谢...我怎样才能改变这个结构并告诉 将你的输出同时重定向到两个 while 循环?如果我将 awk 的输出发送到第二个 while 循环,问题就消失了吗?
  • 如果William 是正确的,那么您可以考虑使用tee 命令将FirstCommand 的输出写入某个临时文件,然后将cat 临时文件写入第二个while 循环。
  • @difley 你能告诉我你改变脚本的意思吗?谢谢
  • 您希望FirstCommand 编写的每一行都被视为两个循环吗?循环是同时运行还是一个接一个?
  • 我希望循环同时运行,是的。我希望看到 FirstCommand 的输出是两个循环。谢谢
【解决方案2】:

试试类似的东西

<FirstCommand> | tee FirstCommand.output | (while read var1; do out=`echo $var1 |<command>` <sth with $out> done; awk -v RS="" '{print $5,$18,$20}' $NmapOut | awk 'NF==3{print}{}' | awk '{gsub (/<blank>/,""); print}' > file.txt; cat FirstCommand.output | while read var2; do <sth> done < file.txt)

其中FirstCommand.output 是一个临时文件,将包含&lt;FirstCommand&gt; 的输出。

【讨论】:

  • 谢谢echo $var1 |&lt;command&gt; \ 的语法正确吗?
  • 不。斜线不应出现。从代码中删除。
  • 请注意OtherFile&lt;FirstCommand&gt; 的每个输出。所以我认为你应该改变它: | (同时读取 var1; do out=echo $var1 |&lt;command&gt; done; awk -v RS="" '{print $5,$18,$20}' OtherFile | awk 'NF==3{print}{}' | awk '{gsub (//,""); print}' > file.txt; cat OtherFile | while read var2; do done
  • 当我运行我的脚本时,file.txt 有时不会被创建(我的意思是当我认为它需要很长时间时。)...那么你认为cat OtherFile 会有所帮助吗?跨度>
  • 如果你不能让我的建议发挥作用,你可以试试 William 对他的回答的评论,他建议将 &lt;FirstCommand&gt; 的输出写入临时文件,并将文件单独 cating 到两个while循环。我不确定为什么不是每次都创建file.txt
猜你喜欢
  • 2021-07-01
  • 2021-12-28
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
相关资源
最近更新 更多