通过编辑命令将 Tail 输出传输到 Xargs 时行为不一致

通过编辑命令将 Tail 输出传输到 Xargs 时行为不一致

我屈服于向SE精神寻求帮助。我将在下面详细展开,但我已将不一致归结为这三行。我正在尝试 grep 单引号(位于方括号内)之间的字符串并将其与 xargs 命令一起使用:

A)这有效:

tail -f -n 1 /var/log/a.log | grep --line-buffered -Po "\'(.*?)\'" | tr -d \'

B)这有效:

tail -f -n 1 /var/log/a.log | grep --line-buffered -Po "\'(.*?)\'" | xargs -t -n1 -d '\n' echo

C) 这不会:

tail -f -n 1 /var/log/a.log | grep --line-buffered -Po "\'(.*?)\'" | tr -d \' | xargs -t -n1 -d'\n' echo

除了一次之外,当我紧接着按 Ctrl-C 时,它会随机起作用。这告诉我它可以工作,它只是挂在某件事上..这是正确的输出:

echo check 
check

D) 这也有效,让我推断它一定是 Tail 的问题,但对故障排除没有帮助,因为这意味着问题只发生在 Tail 上:

echo "Utterance: ['check']" | grep --line-buffered -Po "\'(.*?)\'" |  tr -d \' | xargs -t -n1 -d '\n' echo

..然而为什么它在 B) 中与 Tail 一起工作,但与 Tr 和 Xargs 组合在一起却不起作用。我在尝试过的其他几个字符串提取命令中也看到了相同的挂起问题(或者只是没有响应),而不是:

cut -d\' -f2
awk -F '"' '{print $2}' (on double quotes)
sed -n " s,[^']*'\([^']*\).*,\1,p "
sed 's/.*\' \(.*\)\'/\1/' (doesnt work escaping single quotes)

我(稍微)理解 Xargs 特别关注这里的输入(为什么 xargs 不能与 tail -f 一起使用?)。然而,这个答案是说它是因为 Tail 没有完成,这就是我使用grep --line-buffered.它确实说它使用一次捕获的所有文本并将其分解为使用-n1-d '\n'按行分解(而不是使用-L 1仍然在空格等上分解)。

仅供参考,-t 标志用于详细(t=talk?),-p 将给出交互式确认。

EDIT1:我正要发布另一个奇怪的事情,当使用 Tee 看看发生了什么时,它给出了“回声”?但至少@steeldriver 的评论有效。

tail -f -n 1 /var/log/a.log | grep --line-buffered -Po "\'(.*?)\'" | tr -d \' | tee >/dev/tty | xargs -t -n1 -d '\n' echo
echo 

相关内容