内側のgrepが少ない?


58

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

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

これにより、他にも多くの一般的で興味のないイベントが発生するので、これも除外します。私ができる方法があるgrep -v INSIDEのはless?やるよりも

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

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

回答:


91

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

&pattern

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

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

    ^N または !

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

    ____________
    特定の文字は、pattern;の先頭に入力すると特別です。それらはの一部になるよりむしろ検索のタイプ​​を変更しpatternます。

   (もちろん^N^R表現Ctrl+ NCtrl+ R、それぞれ)。 

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

/コマンドの説明では、

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

そう

  • &eth[01]eth0または  を含む行を表示しますeth1
  • &arp.*eth0含む行が表示されますarpが続きをeth0
  • &arp|dnsarpまたは  を含む行を表示しますdns

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

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

また、と を使用して検索します(および/ 次/前に移動します)。/pattern?patternnN


1
これはほとんどそこにあります!ではless、「&!<1stpattern>」を使用すると、パターンがオンの行を「非表示」にすることができますが、一度に1つのパターンにのみ適用されるため、2番目のパターンを見つけて「&!<2ndpattern>」を適用すると、最初のパターンに一致し、非表示にされていた行が表示されます。とても近い!
-forquare

@forquare:上下矢印キーでアクセスできるコマンド履歴があります。を押して&!から、矢印キーを押します。
PM 2Ring

@forquare:履歴が保存されていることを発見したので、次に実行したときに古いパターンが使用可能になりますless。ただし、再起動後に保存されるかどうかはわかりません。
PM 2Ring

1
最後に欠けていた@orion-パターンを連結する方法。私はパイプ記号を以前に試したことがあり、失敗しましたが、今はもう一度試して動作します!&!<pattern1> | <pattern2> | <pattern3>は、pattern1またはpattern2またはpattern3の行を削除します
1

1
私はそれを考え出した。Homebrew dupesの最新バージョンがあります。正しいファイルを取得していなかったので、bashをキックする必要がありました(/ user / local / bin / lessを取得していると言っても)。
スピンロック

7

オリオンの答えに基づいて、less(1)マニュアルページは説明しています

/pattern

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

    pattern;の先頭に入力した場合、特定の文字は特殊です。彼らは検索の種類を変更するのではなく、変更しますpattern

    ^N または !

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

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

   (もちろん^Nand ^Eなど、Ctrl+ NおよびCtrl+ などを表します E) 

それはそれが判明 し、一緒によく働きます。たとえば、コマンド&pattern/pattern

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

いずれかの順序で入力、(除外)を含むすべての行非表示になりますarpdns(などgrep -v)し、その後、残りの行では、すべての出現強調表示しfailfatalfault、またはSCSIデバイス(の名前のように見える何かをsd[a-z][0-9])。arpまたはdns、およびfailその他の危険語を含む行は表示されないことに注意してください。


2

過去数ヶ月間、私はやや夢中になりましたfzf

あなたのケースでは、限りコンテキストが必要とされていないとして(すなわち、grepの年代の同等-A-Bまたは-C必要に応じて、および方法により、以下のがされていない&も同じ制限があります)、そしてfzfは非常に強力なツールです。

愚かな例です:

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

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

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

試してみます。探しているものが本当にわからない場合や、コンテキストが重要でない場合に、物事を閲覧することになると、驚くほど便利です。

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