![在 awk 模式搜索中指定字符串长度](https://linux22.com/image/65954/%E5%9C%A8%20awk%20%E6%A8%A1%E5%BC%8F%E6%90%9C%E7%B4%A2%E4%B8%AD%E6%8C%87%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%95%BF%E5%BA%A6.png)
我不确定我做错了什么。给定一个 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 操作打印它