在 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 操作打印它

相关内容