web-dev-qa-db-ja.com

特定の文字列を持つ行のないファイルを表示する

taillessなどのプログラムを検索すると、特定の文字列を含む行なしでログを表示できます。たとえば、UFW([UFW BLOCK])エントリ行なしでsyslogを表示します。

12
John Gr.

パターンマッチの反転オプション-v for grepは、これに非常に役立ちます。

grep -v 'UFW BLOCK' /var/log/syslog

これにより、UFW BLOCKを含まないすべての行が表示されます。 grepはデフォルトで基本的な正規表現を使用するため、角かっこを含めると、スペースを含む 'UFW BLOCK'の個々の文字が検索されます。おそらく出力なしで終わるでしょう。文字列を角かっこで囲む必要がある場合は、\[UFW BLOCK\]をエスケープするか、grep-Fオプションを使用して、固定文字列のみを含めます(ありがとう Zanna および Steeldriver これに関するアドバイス):

grep -Fv '[UFW BLOCK]' /var/log/syslog

lessのようなページャーに出力をパイプすることで、見やすくすることができます。

grep -v 'UFW BLOCK' /var/log/syslog | less

または、後で表示するために、出力をホームディレクトリ内のファイルにリダイレクトします。

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog
13
Arronical

seddコマンドを使用して、パターンから行をストリームから削除することもできます。

sed '/\[UFW BLOCK\]/d' /var/log/syslog

[]をエスケープします。通常、これらは文字クラスを示します。つまり、「ここにあるものに一致する」という意味です。

5
Zanna

編集機能を備えた任意のツールを使用できます。既にgrepsedを使用したソリューションが提供されていますが、他にもいくつかの選択肢があります。これらはすべて、lessまたはmoreなどに簡単にパイプできます。

  1. Perl

    Perl -ne 'print unless /\[UFW BLOCK\]/' /var/log/syslog
    

    これはPerlなので、 TIMTOWDI!

    Perl -pe '$_="" if /\[UFW BLOCK\]/' /var/log/syslog
    Perl -ne '/\[UFW BLOCK\]/ || print' /var/log/syslog
    Perl -ne 'print if !/\[UFW BLOCK\]/' /var/log/syslog
    Perl -ne '!/\[UFW BLOCK\]/ && print' /var/log/syslog
    Perl -ne '/\[UFW BLOCK\]/ ? "" : print' /var/log/syslog
    
  2. awk

    awk '!/\[UFW BLOCK\]/' file
    
5
terdon

awkも使用できます:

awk '!/PATTERN/' log

複数の「パターン」があり、次のような2つのgrepを使用したくない場合に使用します。

... | grep -v foo | grep -v bar

構文は次のとおりです。

awk '!/PATTERN/ && !/PATTERN2/' log
2
Ravexina

lessコマンドの&オプションを使用すると、以下のようにフィルタリングして、必要な一致パターンのみを表示できます。

& /PATTERN/

あなたの場合、UFW BLOCKを含むフィルター行を出力に表示したくない場合は、以下のように&!を使用できます。

&! /UFW BLOCK/
1
αғsнιη