ab’s blog

インフラの呟きです。

grepで特定の文字列を含まない正規表現(-vを使わない) REDHAT7

hahahahahaha

はじめに

 grep-vオプション使わないで文字列を含まない行を出す方法です。この方法を覚えておくとサクラエディタ秀丸正規表現にも使え、複雑なフィルターができます。

使用例

こんなファイルがあったとします。

$ ls -1
messages-20230703.gz
messages-20230704.gz
messages-20230705.gz
messages-20230706
messages

これをgrepで圧縮ファイル(gz)以外を表示したいときの正規表現の使いかたです。でポイントとして、

  1. -Pオプションを使う
  2. シングルクォートで囲む
  3. 含めたくない文字は(?! )の中に入れる。そのときに行全体に書かかるような書きかたが必要です。今回だと(?!gz$)と書くと思った結果にならず(?!.*gz$)と、gzの前に.*をつけると表示されます。*1
$ ls -1 | grep -P '^messages(?!.*gz$)'
messages
messages-20230706

本当に正しい書き方は

$ ls -1  | grep  -P  '(?=^messages)(?!.*gz)'
messages
messages-20230706

ちなみに圧縮ファイル以外のファイル名に規則性があれば

$ ls -1 | grep -P '^messages$|messages-[0-9]{8}$'
messages
messages-20230706

以上

*1:理屈はあるのですが自分でも理解しきれてないので省略