我读到 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