두 개의 특정 문자열 중 하나가 없는 행을 표시하기 위해 grep을 사용하려면 어떻게 해야 합니까?

두 개의 특정 문자열 중 하나가 없는 행을 표시하기 위해 grep을 사용하려면 어떻게 해야 합니까?

대용량 로그 파일의 경우 "성공"이 아니거나 "ok"으로 끝나지 않은 줄을 어떻게 표시할 수 있습니까?

답변1

다음을 포함하는 줄을 삭제하세요.누구나문자열, 특히 grep:

  • Jordan의 의견에 따르면 한 명령에서 다음과 같습니다.

    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

관련 정보