awk 패턴 검색에서 문자열 길이 지정

awk 패턴 검색에서 문자열 길이 지정

내가 뭘 잘못하고 있는지 잘 모르겠습니다. test.log가 주어지면:

123.123.123.123 321.321.321.321 GET /test1234/asdfasdfpioasdfjkhweris,9
123.123.123.123 321.321.321.321 GET /4321test/asdfasdfpioasdfjkhweris,9
123.123.123.123 321.321.321.321 GET /test123456/asdfasdfpioasdfjkhweris,9

/와 / 사이의 문자 수를 지정하여 처음 두 개를 분리하려고 합니다.

이게 효과가 있어

cat test* | awk '{if($4 ~ /^\/[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\//) print $0}'

그러나 이것은 그렇지 않습니다

cat test* | awk '{if($4 ~ /^\/[a-zA-Z0-9]{8,}\//) print $0}'

내가 무엇을 놓치고 있나요?

나는 또한 다음을 시도했습니다.

cat test* | awk '$4 ~ /^\/[a-zA-Z0-9]{8}\// {print $0}'

이것도 작동하지 않습니다.

업데이트: gawk를 사용하여 동일한 명령을 시도했는데 나에게도 작동하지만 여전히 작동하지 않습니다.

답변1

cat test* | gawk --re-interval '$4 ~ /^\/[a-zA-Z0-9]{8}\// {print $0}'
# OR
cat test* | gawk --re-interval '{if( $4 ~ "^/[a-zA-Z0-9]{8}/") {print $0}}'

GNU awk 맨페이지에서:

  • --re-interval – 정규식 일치에서 간격 표현식을 활성화합니다.

또한 최소한 하나의 숫자를 포함해야 합니다.

gawk --re-interval '$4 ~ "^/[a-zA-Z0-9]{8}/" &&
                    $4 ~ "^/[^/]{0,7}[0-9]" {print $0}'

답변2

왜 시도해 보지 않겠습니까 ..?

awk -F/ 'length($2) == 8 ' 
  • -F//를 구분 기호로 사용
  • length($2)길이 계산
  • 기본 awk 작업은 이를 인쇄합니다.

관련 정보