我有一个像这样的URL:bbc:osdb://user=&pass=abc%sec=true
我要提取,,,,
示例:
bbc:osdb://293.23.234.55:1234/bbc-dt-af/user=john&pass=pass123abc%sec=true
应该返回:
293.23.234.55:1234:john:pass123
grep
或 egrep
或 sed
或 awk
这个:
grep -Eo '([0-9]+.[0-9]+.[0-9]+.[0-9]+)|[0-9]{4}'
给了我前两个,并且在两个不同的行中......
293.23.234.55
1234
最愚蠢的方法是使用
sed
:
echo 'bbc:osdb://293.23.234.55:1234/bbc-dt-af/user=john&pass=pass123abc&sec=true' | sed 's#.*://\([0-9\.]\{7,15\}\):\([0-9]\+\)/.*user=\([^&]\+\)&pass=\([^&]\+\).*#\1:\2:\3:\4#'
请注意,我修复了我认为原始 URL 中的拼写错误。
awk解决方案:
{
for (i=1; i <= NF; i++) {
if ($i ~ /[0-9\.]{7,15}/) {
host = $i;
} else if ($i ~ /user=/) {
split($i, params, "&");
for (n in params) {
if (params[n] ~ /user=/) {
user = substr(params[n], 6, 100);
} else if (params[n] ~ /pass=/) {
password = substr(params[n], 6, 100);
}
}
}
}
print host ":" user ":" password;
}
运行这个类似
cat file.log | awk -F'/' -f script.awk
如果没有最小完整可重现示例的好处,就不可能涵盖您的确切情况,但可以回答如何从
293.23.234.55:1234:john:pass123
解析bbc:osdb://293.23.234.55:1234/bbc-dt-af/user=john&pass=pass123abc%sec=true
的问题。
有很多方法可以做到这一点。最简单的单个命令是使用
awk
和字段分隔符 '/'
来分隔 URL 的各个部分,然后使用 split()
中的 sub()
和 awk
函数来解析信息。 (您也可以使用 match()
和 substr()
函数)
执行此操作的基本
awk
命令是:
awk -F/ -v OFS=: '{
split($NF,arr,"&")
sub(/^.*=/,"",arr[1])
split (arr[2], pwarr, "%")
sub(/^.*=/,"",pwarr[1])
print $3,arr[1],pwarr[1]
}'
地点:
awk -F/ -v OFS=:
使用 awk
的字段分隔符 FS
和 '/'
的输出字段分隔符 OFS
调用 ':'
,'{
开始awk
规则定义,split($NF,arr,"&")
将最后一个字段 ($NF
) 拆分为 arr
上的 "&"
,sub(/^.*=/,"",arr[1])
从 user=
中删除
john
split (arr[2], pwarr, "%")
将 pass=pass123abc%sec=true
上的 "%"
拆分为 pwarr
,sub(/^.*=/,"",pwarr[1])
从 pass123abc 中删除 pass=,并且print $3,arr[1],pwarr[1]
输出结果。示例/输出
$ echo "bbc:osdb://293.23.234.55:1234/bbc-dt-af/user=john&pass=pass123abc%sec=true" |
> awk -F/ -v OFS=: '{
> split($NF,arr,"&")
> sub(/^.*=/,"",arr[1])
> split (arr[2], pwarr, "%")
> sub(/^.*=/,"",pwarr[1])
> print $3,arr[1],pwarr[1]
> }'
293.23.234.55:1234:john:pass123abc