tailの出力をフィルタリングすることは可能ですか?


11

ファイルを末尾にしたいが、特定の文字列を含む出力行のみを出力したい。これは可能ですか?

回答:


32

grepを使用します。その目的のためだけに構築されました。

/ var / log / syslogの末尾から「cron」が含まれる行を見つけるには、次を実行します。

tail -f /var/log/syslog | grep cron

また、stdinを介して何でも受け入れるため、上記と同じ方法で(|記号を使用して)パイピングすることにより、他のコマンドの出力でも使用できます。


8
これは基本的に正しいgrepことですが、より長いパイプラインの一部である場合など、非対話的に使用された場合にバッファリングされることを認識することが重要です。GNU grep 2.5.1は--line-buffered、パイプラインからgrepを削除することがオプションではない場合に、この問題を回避するオプションを提供します。(grepがバッファリングすると言うとき、バッファが4kのような値に達するまで出力が表示されないことを意味します。)
kojiro

以前のコメントを補足するために、最新のLinuxでの「tail -f」はループで動作し、syslogファイルへの追加入力を待機します。コマンドを実際にファイルの内容で終了させるには、-fスイッチを省略します。tail / var / log / syslog | grep cron
Gnudiff

7
tail -f /var/log/messages | grep "myfilterword"

お役に立てば幸いです。


4

他にもいくつかのアイデアがありますが、それほど単純ではありませんが、いくつかの興味深い追加の柔軟性があります。

最初に、grepの代わりにawkでフィルタリングできます。

tail -f /var/log/messages | awk '/myfilterword/'

これはを使用した例とまったく同じように機能しgrepます。awkのパワーを使用して、これを拡張できます。次に例を示します。

tail -f /var/log/messages | \
awk '/myfilterword/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n")}'

出力の6番目から最後のフィールドを出力します(フィールドは空白で区切られています)

別の同様のアイデアは、perl one-linerを使用することです:

tail -f /var/log/messages | perl -ne "/myfilterword/ and print"

それはまったく同じように動作しgrepます。たぶん、行番号カウンターと6番目のフィールドだけが必要ですか?これはどう:

tail -f /var/log/messages | \ 
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"

明らかに、これらの種類のすべては他のツールでも実行できますが、ここでawkやperlなどのより汎用的な言語を使用する楽しい方法があることを説明したかったのです。


grepよりもさらに拡張する方法について、すばらしい精緻化を1つ加えてください。
パブロ

2

省略したいヘッダーを含むCSVファイルがある場合、注目に値する別のトリック、たとえば:

% cat data.txt
fruit        dessert        calories
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990
% tail -n +2 data.txt
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990

入力は、どのくらいの時間が問題ではないtail、ある+n -2最初の行を省略します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.