web-dev-qa-db-ja.com

内側のgrepは?

私は現在、いくつかの問題を探すために、多くの見慣れないログを調べています。最初に見たファイルはEvents.logで、lessに少なくとも3つのページが表示されます。これらのページは、同じイベントをさまざまなタイミングで表示しているように見えます。かなり害のないイベントです。このイベントを除外したいのですが、現在lessを終了して次のようなことをしています

grep -v "event text" Events.log | less

これにより、他にも多くの一般的で興味のないイベントが発生しますが、これらも除外したいと思います。できる方法はありますかgrep -vinside of less?する必要があるよりも

egrep -v "event text|something else|the other thing|foo|bar" Events.log | less

これは、あらゆる種類のログファイルを見るときに便利な機能だと思います。lessがツールではない場合、私が求める品質の別のものはありますか? lessが組み込まれたgrepスタイルのビューアです。

63
forquare

lessには非常に強力なパターンマッチングがあります。 man page から:

&pattern

    patternに一致する行のみを表示します。 patternに一致しない行は表示されません。 patternが空の場合(&を入力した直後に ENTER)、すべてのフィルタリングがオフになり、すべての行が表示されます。フィルタリングが有効になっている間は、ファイルの一部の行が非表示になっている可能性があることを示すために、プロンプトの先頭にアンパサンドが表示されます。

    /コマンドのように、特定の文字は特殊です

    ^Nまたは!

      patternと一致しない行のみを表示します。
    ^R
      正規表現のメタ文字を解釈しないでください。つまり、単純なテキスト比較を行います。

    ____________
    patternの先頭に入力した場合、特定の文字は特殊です。 patternの一部になるのではなく、検索のタイプ​​を変更します。

(もちろん^N^Rは Ctrl+N そして Ctrl+R、それぞれ。)

したがって、たとえば、&dnsは、パターンdnsに一致する行のみを表示し、&!dnsは、それらの行を除外(除外)して、パターンに一致しない行のみを表示します。 。

/コマンドの説明では、

    patternは、システムが提供する正規表現ライブラリによって認識される正規表現です。

そう

  • &eth[01]は、eth0またはeth1を含む行を表示します
  • &arp.*eth0は、arpの後にeth0が続く行を表示します
  • &arp|dnsは、arpまたはdnsを含む行を表示します

また、!は上記のいずれでも反転できます。したがって、質問の例で使用するコマンドは次のとおりです。

&!event text|something else|the other thing|foo|bar

また、検索には/patternおよび?patternを使用します(次へ/前へ移動するにはn/N)。

101
orion

orion's answer に基づいて、 less(1)のマニュアルページ を説明します

/pattern

    ファイルを前方に検索します N-patternを含む行。 Nデフォルトは1です。patternは、システムが提供する正規表現ライブラリによって認識される正規表現です。検索は表示される2行目から始まります(ただし、これを変更する-aおよび-joptionsを参照してください)。

    patternの先頭に入力した場合、特定の文字は特殊です。 patternの一部になるのではなく、検索のタイプ​​を変更します。

    ^Nまたは!

      patternと一致しない行を検索します。
    ^Eまたは*
      複数のファイルを検索します。つまり、一致が見つからずに検索が現在のファイルの終わりに達した場合、検索はコマンドラインリストの次のファイルで続行されます。
    ^Fまたは@
      現在画面に表示されているものや-aまたは-joptionsの設定に関係なく、コマンドラインリストのFIRSTファイルの最初の行から検索を開始します。
    ^K
      現在の画面でpatternに一致するテキストを強調表示しますが、最初の一致(現在の位置を保持)には移動しません。
    ^R
      正規表現のメタ文字を解釈しないでください。つまり、単純なテキスト比較を行います。

    ____________
    コマンドの前に10進数を付けることができます。 N説明で…

(もちろん^N^Eなどは、 Ctrl+N そして Ctrl+E、など)

&pattern/patternはうまく連携していることがわかりました。たとえば、コマンド

  • &!arp|dnsEnter
  • /Ctrl+Kfail|fatal|fault|sd[a-z][0-9]Enter

いずれかの順序で入力すると、arpまたはdnsgrep -vなど)を含むすべての行を非表示(除外)し、残りの行でfailfatalfault、またはSCSIデバイスの名前(sd[a-z][0-9])のようなもの。 arpまたはdns、およびfailまたはその他の危険な単語を含む行は、表示されませんが表示されます。

ここ数か月の間に、私はfzfにやや夢中になりました。

あなたの場合、コンテキストが必要でない限り(つまり、grepの-A-B、または-Cに相当するものは必要ありません。方法として、lessの&にも同じ制限があります)、fzfは非常に強力なツールです。

これはばかげた例です:

printf "%s\n" {aa,bb,cc}{dd,ee,ff}{gg,hh,ii} | fzf

これを実行して、aa | bb dd | ee !gg !hhなどの入力を操作すると、何が起こっているのかがすぐにわかります。

|演算子に関するFzfのドキュメントはまばらですが、私の推測では、直前と直後の用語にのみ適用されるため、ORがANDよりも優先されます。 (これはimplicitです。すべての用語はデフォルトでANDで結合されています。)しかし、ほとんどの場合、これは問題にならず、私の経験では問題はありません。

試してみます。何を探しているのか本当にわからないときや、文脈が問題にならないときに、ブラウジングに関しては、驚くほど便利だと思いました。

2
sitaram