Grepは文字列を見つけましたが、文字列を含むコメント付きアイテムを無視します。

Grepは文字列を見つけましたが、文字列を含むコメント付きアイテムを無視します。

gmail単語やカテゴリを探していますoutlook。一部の行はコメントアウトされていgmailますoutlook。私は何をgrepすべきですか?

私はたくさん試してみましたが、次のようになると思いました。

grep "^[^#;]" | egrep -i "gmail|outlook" *.ksh  > a.log

答え1

そしてgrep

grep -P '^(?=[\s]*+[^#])[^#]*(gmail|outlook)' file
  • -PPerl準拠の正規表現を有効にします。
  • ^(?=...)パターンの一部ではないキャプチャグループ(プレビュー、Perl拡張)を定義します。これは^行の始まりを意味します。
    • このグループは内部的に\sすべての空白文字と一致し、*+空白と0回以上一致し、貪欲です(Perl拡張子)。
    • [^#]一致しないすべての項目と一致します#
  • [^#]*キャプチャグループの外側に#0回以上存在しない文字を再一致させます。
  • (gmail|outlook)最後の試合gmailまたはoutlook

さまざまな例を使用してテストファイルを作成しました。

$ cat file
# outlook
blah gmail # this should match
# gmail
  # gmail
        # foo
blah outlook # this should match
  outlook blah # gmail - this should match
foobar # gmail
        bar
        another gmail # this should match

出力は次のとおりです

blah gmail # this should match
blah outlook # this should match
  outlook blah # gmail - this should match
        another gmail # this should match

もちろん、*.kshすべてのファイルに対してこのコマンドを実行できます。

grep -P '^(?=[\s]*+[^#])[^#]*(gmail|outlook)' *.ksh  > a.log

答え2

したがって、.kshその文字列の現在のディレクトリ内のすべてのファイルを検索します。で始まる行を除いてgmail出力を 。outlook#a.log

いいねgrep -P "^(?=[^#])(.*gmail.*|.*outlook.*)" *.ksh > a.log

答え3

使い方:

egrep "gmail|outlook" *.ksh | grep -v ^[#]

まず、grep「gmail」または「outlook」を含むすべての行を取得し、2番目はgrepコメント行を無視します。

関連情報