我有一个这样的 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:pass123abc
grep
或egrep
或sed
或awk
这个:
grep -Eo '([0-9]+.[0-9]+.[0-9]+.[0-9]+)|[0-9]{4}'
给我前两个,并且在两行不同的行...
293.23.234.55
1234
如果没有“最小完整可重现示例”的帮助,就不可能涵盖您的具体情况,但可以回答如何
293.23.234.55:1234:john:pass123abc
从中进行解析的问题bbc:osdb://293.23.234.55:1234/bbc-dt-af/user=john&pass=pass123abc%sec=true
。(您没有提供任何规则来解释"abc"
从密码末尾删除的内容)有很多方法可以做到这一点。最简单的方法是使用单个命令,使用
awk
字段分隔符'/'
来分隔 URL 的各个部分,然后使用split()
和sub()
函数awk
来解析信息。(您也可以使用和函数match()
)substr()
awk
执行此操作的基本命令是:在哪里:
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])
移除pass=
pass123abc
print $3,arr[1],pwarr[1]
输出结果,以及}'
结束规则。示例/输出
注意,如果您打算
"abc"
从密码末尾删除,请告诉我。没有分隔符可以证明从密码中截断最后 3 个字符是合理的(除了随机用substr()
或截断 3 个字符sub()
——这没有多大意义)。所以完整的密码保持不变。使用您显示的示例,请尝试以下
awk
解决方案。简单的解释是将字段分隔符设置为/
,=
然后%
检查其第 3 个字段是否与正则表达式匹配,如果是,则根据问题打印第 3 个和第 7 个字段。这可能是您想要的,使用 any
awk
:或任何
sed
:但仅给出 1 个样本输入字符串就很难判断。
最愚蠢的方法是
sed
:请注意,我修复了原始 URL 中我认为的拼写错误。
awk解决方案:
运行如下命令
我只能使用 GNU 提供部分解决方案,因为没有给出
AWK
pass 值在字符处终止的原因。让内容为a
file.txt
然后
给出输出
说明:我告诉 GNU
AWK
是/
字段分隔符,:
是输出字段分隔符。我使用match
字符串函数来查找键用户的键值对的起始位置(RSTART
)以及长度(RLENGTH
),然后我获取没有 5 个前字符的子字符串(即user=
)并将其放入名为 user 的变量中。然后我打印第 3 个字段(将字符串视为 -/
分隔值)后跟 user。请注意,用户设置操作与 相关联match
,因此如果找不到正则表达式,它将不会被执行,在这种情况下它将假定 user 值为空字符串。如果您能够提供 pass 值中禁止的值(例如&
对于 user),您将能够同样提取 pass,但是您的示例同时具有a
pass 值的一部分和终止它,因此您显然需要不同的方法。(在 GNU Awk 5.1.0 中测试)