私はあきらめてSE精神に助けを求めた。これについては以下でより詳細に説明しますが、不一致をこの3行に圧縮しました。一重引用符(括弧内)の間の文字列を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が完了していないためだと言います。これは、キャプチャされたすべてのテキストを一度にインポートして使用し、1行ずつgrep --line-buffered
分解すると言います(まだ分解されているTailを使用するのとは対照的です)。スペースなど)。 -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