私はテールログファイルを使用していますtail -f messages.log
が、これは出力の一部です。
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eget tellus sit amet odio porttitor rhoncus. Donec consequat diam sit amet tellus viverra pellentesque. tail: messages.log: file truncated Suspendisse at risus id neque pharetra finibus in facilisis ipsum.
tail: messages.log: file truncated
ファイルが自動的に切り捨てられる場合が表示されますが、tail
この切り捨てメッセージなしで出力のみを表示したいと思います。
試してみましたtail -f messages.log | grep -v truncated
が、まだメッセージが表示されます。
このメッセージを表示しない方法はありますか?
答え1
このメッセージは次の形式で出力されます。標準エラーすべての警告とエラーメッセージと同じです。
すべてのエラー出力を削除できます。
tail -f file 2> /dev/null
または、以下を含むエラーメッセージのみをフィルタリングしますtruncate
。
{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1
ただし、これは終了ステータスが失われることを意味しますtail
。一部のシェルには、パイプにpipefail
障害が発生したときに終了ステータスを報告するオプション(有効化を使用)がありますset -o pipefail
。また、/array でパイプラインのさまざまなコンポーネントの状態を報告することもできます。tail
zsh
bash
$pipestatus
$PIPESTATUS
zsh
またはを使用すると、bash
次のようになります。
tail -f file 2> >(grep -v truncated >&2)
grep
ただし、コマンドは待たないため、終了後にエラーメッセージ(存在する場合)が表示されることがあり、シェルはスクリプトで次のコマンドの実行を開始しました。tail
では、zsh
以下を作成してこの問題を解決できます。
{ tail -f file; } 2> >(grep -v truncated >&2)
zsh
これについてはマニュアルで説明していますinfo zsh 'Process Substitution'
。
追加の問題があります
>(PROCESS)
。外部コマンドに接続すると、親シェルはPROCESSが完了するのを待たないため、後続のコマンドが完了する結果に依存することはできません。問題と解決方法は第1章で説明したものと同じです。多数存在するリダイレクトに注意してください::。したがって、上記の例の単純化されたバージョンでは次のようになります。paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)
(MULTIOS は関係ありません。) PROCESS は、親シェルに関する限り、非同期で実行されます。解決策は次のとおりです。
{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)
ここの追加プロセスは、親シェルで作成され、完了するまで待ちます。
答え2
これはファイルの内容が原因で発生します。
上書き>
- 追加されたコンテンツはありません。>>
。
答え3
出力が削除されないと、grep
標準エラーで印刷される可能性が高くなります。これを取り除く最も簡単な方法は、単に捨てることです。
tail -f messages.log 2>/dev/null