使用 shell 从 URL 中提取多个部分

问题描述 投票:0回答:2

我有一个像这样的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
regex shell sed grep string-matching
2个回答
0
投票

最愚蠢的方法是使用

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

0
投票

如果没有最小完整可重现示例的好处,就不可能涵盖您的确切情况,但可以回答如何从

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
© www.soinside.com 2019 - 2024. All rights reserved.