sed と xargs で tail -f を使用します。

sed と xargs で tail -f を使用します。

/tmp/test毎秒ファイルに数字+一重引用符を書き込む次のプロセスがあるとします。

for i in {1..1000} ; do echo $i\' ; sleep 1 ; done > /tmp/test

tail -fその後、他の機能で使用して実行したいと思います。テスト目的で以下を使用していますecho

tail -f /tmp/test | xargs echo

これにより、次のエラーが発生します(入力を引用符なしで実行すると問題ありません)。

xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option

方程式にsedを追加すると、まったく結果が得られません。

tail -f /tmp/test | sed "s/['\"]//g" | xargs echo

追加した後に出力が得られない理由や、sed入力する前に入力から引用符を削除する方法についてのアイデアはありますかxargs

答え1

たくさんあります。

まず、「tail -f」は完了しないため、「xargs」も同様に無期限に実行され続けます。 2番目のウィンドウを開き、「tail -f」プロセスを「kill -HUP」して「tail -f」と「xargs」を完了して出力を生成できます。

第二:「xargs」は入力をバッファリングし、「フルバッファ」と思われるものを取得しません。したがって、1000秒の表示が出力されたときにechoコマンドを一度も実行しませんでした。 "xargs"が各入力行に対して個別にechoを実行するようにするには、xargsに "-n 1"オプションを追加する必要があります。

一重引用符が好きではない「xargs」の場合、「-d '\ n'」オプションを使用して引用符の処理を無効にし、入力引数のみを改行で区切ることができます。

答え2

おそらく

tail -f /tmp/test | sed "s/['\"]//g" | while read line; do
  do_something "$line"
done

確認してください:https://stackoverflow.com/questions/199266/make-xargs-execute-the-command-once-for-each-line-of-input

関連情報