bash - 一次处理一行输出

bash - 一次处理一行输出

我读到 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 提供的要小。

答案1

你可以尝试同样的命令,这次使用多个 hack 来避免缓冲

./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

相关内容