2つの特定の文字列のうちの1つを持たない行を表示するためにgrepを使用するにはどうすればよいですか?

2つの特定の文字列のうちの1つを持たない行を表示するためにgrepを使用するにはどうすればよいですか?

大容量ログファイルの場合、「成功」ではないか「ok」で終わらない行をどのように表示できますか?

答え1

以下を含む行を削除してください。誰でも文字列、特にgrep:

  • Jordanのコメントによると、1つのコマンドで次のようになります。

    grep -Ev 'success|ok$'
    

    または:

    grep -ve success -e 'ok$'
    

    または:

    grep -v 'success
    ok$'
    
  • 両方のコマンドで:

    grep -v success file | grep -v 'ok$'

例:

$ cat file
success something else
success ok
just something else

$ grep -Ev 'success|ok$'
just something else
$ grep -v success file | grep -v 'ok$'
just something else

以下を含む行を削除してください。両方文字列、特にgrep:

grep -v 'success.*ok$' file

例:

$ cat file
success something else
success ok
just something else

$ grep -v 'success.*ok$' file
success something else
just something else

答え2

試してみましょうawk

awk '/success/ { next ; } /ok$/ { next ; } { print ;}' file

どこ

  • /success/ { next ; }単語を検索してsuccess行をスキップ
  • /ok$/ { next ; }小文字を検索してok行をスキップする
  • { print ;}暗黙のelse:印刷ライン

提案によると

ショート awk (Stéphane Chazelasに感謝)

awk '!/success/ && !/ok$/'

これは基本的に(成功)でも(行末OK)でもありません.

ゴルフをする(ありがとう CAS)

awk '! /success|ok$/'

正規表現を再利用し、それを無効にします。

答え3

上記のgrep -Evコマンドに追加:以下を使用できます。egrep -v 'success|ok$' filename

答え4

awkが言及されているので、他のオプションはsedです。

sed '/success/d;/ok$/d' file
sed -e '/success/d' -e '/ok$/d' file

または(最新のsedと今後のPOSIX)Stéphane Chazelasに感謝します.

sed -E '/success|ok$/d' file

関連情報