我不确定我做错了什么。给定一个 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 操作打印它