bash - 一次处理一行输出


2

我读到xargs很适合一次处理一行命令的输出(并且它是)。我的脚本中有以下行。

./gen-data | awk '{printf $2 " "; printf $1=$2=$3=""; gsub (" ", "", $0);if(length($0) == 0){ print "0000"} else{print $0}}' | xargs -t -n2 -P1 bash -c 'datatojson "$@"' _

它产生正确的输出,毫无疑问。然而,gen-data产生类似于1000行的东西,而我真正想要的是这个命令在每一行之后执行,而不是在1000行之后执行(它明显停止以获得更多输入)。

以下是gen-data的样子:

candump $interface &
while true; do
    while read p; do
        cansend $interface $(echo $p | awk 'NF>1{print $NF}');
    done < <(shuf $indoc)
done

cansend将数据发送到接口并candump从该接口读取并将其输出到屏幕上,但我打赌这不太相关)。在任何情况下candump似乎都是连续的流输出,但是当我将其输入awk并且xargs,它变得更加分散。是因为我用过shuf吗?我认为,因为它通过界面,并在另一侧阅读,它将比shuf提供的更少。


你在用Wy shuf吗?这个脚本不使用它吗?(我知道它应该,但有必要排除它)
Felipe Lema 2015年

@FelipeLema我只是尝试了cat而不是shuf它正在做同样的事情。不知道我怎么能把它送进那个循环,我在脚本编写方面不是很有经验。
user3475234 2015年

Answers:


3

您可以尝试相同的命令,这次使用多个hacks来避免缓冲

./gen-data | gawk '{printf $2 " "; printf $1=$2=$3=""; gsub (" ", "", $0);if(length($0) == 0){ print "0000"} else{print $0}; fflush(stdout)}' | stdbuf -o0 xargs -t -n2 -P1 bash -c 'datatojson "$@"' _

注意从awk变为gawk和使用的变化fflush。你也可以试试mawk -Winteractive。还要介意我stdbuf -o0在xargs之前添加。您也可以在开头尝试最新的./gen-data


工作得很完美。什么是-o0做的stdbuf命令?
user3475234 2015年

1
正如stdbuf man页面中所述:将命令的缓冲设置为“无缓冲”
Felipe Lema 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.