범위를 제외하면서 특정 열에서 IP 범위가 포함된 행을 제거합니다.

범위를 제외하면서 특정 열에서 IP 범위가 포함된 행을 제거합니다.

다음 형식의 로그 파일이 있습니다.

Jul 13 21:47:41 192.168.100.254 "user from 192.168.100.101"

192.168.xx 범위의 IP가 포함된 모든 행을 제거해야 하지만 네 번째 열에 나타나는 경우에만 해당됩니다.

또한 192.168.xx 범위에서 3개의 IP를 제외해야 합니다. 이것을 부르자

192.168.125.100
192.168.126.100
192.168.155.240 

이 명령을 완료하여 열 4에서 192.168.xx 범위의 모든 IP를 찾고 192.168.125.100, 192.168.126.100 및 192.168.155.240을 포함하는 행을 제외한 모든 행을 삭제하는 방법.

awk '{print $4}' file | grep '192.168' | "remove all found except" | > save back to original file

답변1

노력하다:

awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file

다음 테스트 파일을 고려해보세요.

$ cat file
Jul 13 21:47:41 192.168.100.254 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.125.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.126.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.155.240 "user from 192.168.100.101"
Jul 13 21:47:41 123.456.789.240 "user from 192.168.100.101"

귀하의 규칙에 대해 제가 이해한 바로는 위의 첫 번째 줄을 제외한 모든 항목을 유지하려고 합니다.

$ awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file
Jul 13 21:47:41 192.168.125.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.126.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.155.240 "user from 192.168.100.101"
Jul 13 21:47:41 123.456.789.240 "user from 192.168.100.101"

여러 줄 버전

코드를 여러 줄에 걸쳐 분산시키려는 경우:

awk '
  {
    f=1
  }

  $4 ~ /^192.168/ {
    f=0
  }

  $4 ~ /192.168.(125.100|126.100|155.240)/ {
    f=1
  }

  f
  ' file

어떻게 작동하나요?

이 코드는 단일 변수를 사용합니다 f. 줄을 유지하려면 을 설정합니다 f=1. 그렇지 않으면 f0으로 설정합니다.

  • f=1

    먼저 행이 보존되어야 한다고 가정해 보겠습니다.

  • $4 ~ /^192.168/{f=0}

    $4로 시작하는 경우 192.168해당 줄을 우리가 잃어야 할 줄로 표시하세요.

  • $4 ~ /192.168.(125.100|126.100|155.240)/{f=1}

    이러한 세 가지 특수한 경우에는 행을 keeper: 로 표시하십시오 f=1.

  • f

    이것은 awk의 비밀스러운 약칭입니다. ftrue(0이 아닌 경우)인 경우 해당 행을 인쇄합니다.

추가 테스트

의견을 바탕으로 file2를 시도해 보겠습니다.

$ cat file2
Jul 13 21:47:41 192.168.100.125 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.202.150 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.101.45 "user from 192.168.100.101"

이제 다음 명령을 실행해 보겠습니다.

$ awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file2
$ 

이 줄은 모두 그대로 삭제됩니다.

관련 정보