내가 뭘 잘못하고 있는지 잘 모르겠습니다. 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 작업은 이를 인쇄합니다.