如何从含URL的文件中筛选首个参数名唯一的带参URL?
问题原因说明
- 你最初写的awk命令报错是因为
sub()函数缺少替换目标和替换内容参数,同时正则没有用引号包裹、转义规则不符合awk语法要求。 - 后续调整的
awk -F '?|&' '$2&&!a[$2]++'无法过滤无效行的原因是:该命令没有先校验URL是否存在合法的?参数名=结构,遇到没有?的垃圾行时,字段分割逻辑失效,会把&开头的内容误判为参数字段,导致错误输出。
正确实现命令
直接一行awk即可同时完成有效URL筛选、首个参数名去重两个需求:
awk 'match($0, /\?([a-zA-Z0-9]{1,9})=/, m) && !seen[m[1]]++' url文件路径
逻辑说明
- 先通过
match()匹配URL中?参数名=的结构,匹配失败的行(无参数、参数结构无效的垃圾内容)直接跳过,不会输出 - 匹配成功后将首个参数名存入数组
m,判断该参数名是否在去重数组seen中存在:- 第一次出现的参数名对应URL直接输出,同时给
seen数组对应标识加1 - 后续出现相同首个参数名的URL直接丢弃,实现去重效果
- 第一次出现的参数名对应URL直接输出,同时给
匹配效果验证
针对你给出的示例文件,执行上述命令后输出结果和你预期完全一致:
https://example.com/endpoint/?param1=123¶m2=1212 https://example.com/endpoint/?param3=123¶m1=98989 https://example.com/endpoint/endpoint3/?param2=123
内容的提问来源于stack exchange,提问作者Emad
相关产品推荐
相关产品推荐

