
-f フラグを使用してログ ファイルを tail しています。次に、これを grep にパイプして、「X」を含む行だけを検索します。これで問題なく動作します。次に、これを別の grep にパイプして、「Y」を含む行をすべて削除します。2 番目のパイプを追加すると、ファイルの更新が停止し、データが何も来ていないように見えます。
機能するコマンドは次のとおりです: tail -f my_file.log | grep "X"
これは実行されないコマンドです: tail -f my_file.log | grep "X" | grep -v "Y"
コマンドが機能するようにこれをどのように構成すればよいでしょうか?
答え1
の出力はgrep
バッファリングされるため、行バッファリングを有効にするには--line-buffered
のオプションを使用します。grep
tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'
grep
オプションがない場合は、stdbuf
代わりに次のものを使用できます。
tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'
答え2
awk
通常、次のような論理チェックの方が便利だと思います:
tail -f /path/to/log | awk '/X/ && !/Y/'
# ^^^ ^^^^
# this I want but not this
2 つのタブを使用してテストしました。1 つは書き込みを続けるタブseq 20 >> myfile
、もう 1 つはたとえば ですtail -f myfile | awk '/3/ && !/13/'
。
答え3
別の方法としては、2 回ではなく 1 回のgrep
呼び出しを使用して、バッファリングの問題を回避することです。行末まで、0 個以上の非 Y 文字、次に X、そして再び 0 個以上の非 Y 文字で構成される行に一致する正規表現を使用するだけです。
tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'