我屈服于向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