如何用Shell工具(grep/sed/awk)从指定URL提取多段信息?
提取URL中的IP端口、用户名和密码的Shell命令
方法1:使用sed(推荐,简洁高效)
直接通过正则捕获目标字段,一次性输出结果:
echo "bbc:osdb://293.23.234.55:1234/bbc-dt-af/user=john&pass=pass123abc%sec=true" | sed -E 's/^.*:\/\/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+)\/.*user=([^&]+)&pass=([^%]+).*$/\1:\2:\3/'
说明:
-E启用扩展正则,减少转义符使用^.*:\/\/匹配URL开头到://的所有内容([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+)捕获IP+端口的组合(第一组)\/.*user=匹配到user=前的路径内容([^&]+)捕获用户名(直到&结束,第二组)&pass=([^%]+)捕获密码(直到%结束,第三组)- 最终用
\1:\2:\3将三个捕获组用冒号连接输出
方法2:使用awk(灵活适配格式小变化)
通过分割字段的方式提取各部分:
echo "bbc:osdb://293.23.234.55:1234/bbc-dt-af/user=john&pass=pass123abc%sec=true" | awk -F'://' '{ split($2, part1, "/") ip_port = part1[1] split(part1[3], params, "&") split(params[1], user_arr, "=") split(params[2], pass_arr, "%") print ip_port ":" user_arr[2] ":" pass_arr[2] }'
说明:
- 先用
://分割URL,分离出包含IP端口的后半段 - 再用
/分割后半段,提取IP端口和参数部分 - 用
&分割参数,分别拆分用户名、密码字段 - 最后拼接成目标格式输出
方法3:grep+sed+tr组合(直观易理解)
分步提取再拼接结果:
echo "bbc:osdb://293.23.234.55:1234/bbc-dt-af/user=john&pass=pass123abc%sec=true" | grep -Eo '([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+)|user=[^&]+|pass=[^%]+' | sed -E 's/user=//; s/pass=//' | tr '\n' ':' | sed 's/:$//'
说明:
grep -Eo提取出IP端口、user=xxx、pass=yyy三行内容sed移除user=和pass=前缀tr '\n' ':'将换行符替换为冒号- 最后一个
sed去掉末尾多余的冒号
内容的提问来源于stack exchange,提问作者Kevin Rave
相关产品推荐
相关产品推荐

