awk提取URL域名的核心是先去除协议头和路径,再剔除端口与用户名;标准命令为sub去协议、截路径、删端口、去用户;健壮方法用split分步提取主机字段并清理;正则匹配适用于日志等杂乱文本。

直接用 awk 提取 URL 中的域名,核心是去掉协议头(http:// 或 https://)和路径部分,只保留主机名(即域名)。关键在于正确分割和截取,而不是简单按斜杠切分——因为有些 URL 带端口、用户信息或无协议。
基础方法:用斜杠分割,取第二段再剔除端口和用户
对形如 https://user@sub.example.com:8080/path?query 的 URL,标准做法是:
- 先以
//为界,取后面部分(用sub("^[^/]*//","",$1)去掉协议) - 再以第一个
/截断,得到sub.example.com:8080这样的字符串 - 接着用
sub(":[0-9]+$","",$1)去掉端口号 - 最后用
sub("^[^@]*@","",$1)去掉用户名(如user@)
整合成一行命令:awk '{sub("^[^/]*//","",$1); sub("/.*$","",$1); sub(":[0-9]+$","",$1); sub("^[^@]*@","",$1); print $1}' urls.txt
更健壮的方法:用冒号+斜杠双分隔符拆解
利用 split() 函数按 :// 和 / 分步提取,逻辑更清晰:
-
split($1,a,"://")→ 协议存a[1],剩余部分存a[2] -
split(a[2],b,"/")→b[1]就是完整主机字段(含端口和用户) - 再对
b[1]做清理:sub(/:.*/,"",b[1]); sub(/^[^@]*@/,"",b[1])
示例命令:awk '{n=split($1,a,"://"); split(a[n],b,"/"); host=b[1]; sub(/:.*/,"",host); sub(/^[^@]*@/,"",host); print host}' urls.txt
匹配并提取域名(支持正则精准定位)
如果 URL 混在大段文本中(比如日志行),可用正则直接捕获域名:
- 模式
/(https?:\/\/)?([^\/\s]+)/可匹配开头可选协议后的首个非斜杠非空格串 - 用
match($0, /https?:\/\/([^\/\s]+)/, arr)(GNU awk 4.0+)提取子组 - 或兼容写法:
sub(/^.*https?:\/\//,"",$0); sub(/\/.*$/,"",$0); print $0
注意:后者需确保输入是单个 URL;前者更适合从杂乱文本中抽取出域名。
处理常见变体:带 www 或不带、含 path、含 query
无论 URL 是 http://www.baidu.com、example.org/api 还是 https://admin@dev.test:3000/login?next=/,上面任一方法都能剥离出 www.baidu.com、example.org、dev.test。关键是把“域名”定义为协议之后、第一个 / 之前、不含端口和用户信息的部分。


















