【问题标题】:Regular expression to retrieve a string from a multiline file text从多行文件文本中检索字符串的正则表达式
【发布时间】:2020-06-03 02:00:20
【问题描述】:

我正在寻找一种方法来通过查找对等点的秘密来提取对等点 IP。

例子:

peer 1.2.3.10 {
    authentication {
        mode pre-shared-secret
        pre-shared-secret SecretPasswordA
    }
    connection-type initiate
    ike-group IKE_1.2.3.4
    local-address 6.7.8.9
    vti {
        bind vti64
        esp-group ESP_1.2.3.4
    }
}
peer 1.2.3.20 {
    authentication {
        mode pre-shared-secret
        pre-shared-secret SecretPasswordB
    }
    connection-type initiate
    ike-group IKE_1.2.3.4
    local-address 6.7.8.9
    vti {
        bind vti64
        esp-group ESP_1.2.3.4
    }
}
peer 1.2.3.30 {
    authentication {
        mode pre-shared-secret
        pre-shared-secret SecretPasswordC
    }
    connection-type initiate
    ike-group IKE_1.2.3.4
    local-address 6.7.8.9
    vti {
        bind vti64
        esp-group ESP_1.2.3.4
    }
}

如果我知道 SecrePasswordB,我需要检索对等 IP,即 1.2.3.20,如果未找到则为空(或其他任何易于识别的 IP)。

文本来自一个shell命令到一个变量中(即TEXT=$(command_string))。

因为我只有一个基本的 shell 并且系统上可用的工具很少,需要使用非常基本的 linux 工具来完成。在这里我找不到解决方案......

【问题讨论】:

  • 什么外壳?什么工具?你有awk还是perl?这是一个麻烦的问题,例如单独 bash。

标签: regex bash sh


【解决方案1】:

假设您有一个变量 TEXT 分配给提供的整行 举个例子,请你试试:

secret="SecretPasswordB"        # or assign to your actual string
secret=$(printf %q "$secret")   # escape metacharacters just in case

pat='peer[[:blank:]]+(([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3})[[:blank:]]*\{[^{]+authentication[[:blank:]]*\{[^}]+pre-shared-secret[[:blank:]]+'"$secret"

if [[ $TEXT =~ $pat ]]; then
    echo "${BASH_REMATCH[1]}"
fi

输出:

1.2.3.20

请注意,上面的正则表达式仅针对给定示例进行测试,对于任意输入可能不够稳健。

【讨论】:

    【解决方案2】:

    如果数据被格式化成单独的行,如问题所示,那么一个简单的 shell 脚本就足够了。只需将输入拆分为前导词,然后是其余词。每当读取“对等”行时保存 IP。如果读取了密钥,则打印最新的 IP。

    getPeerIP

    #!/bin/sh
    
    secret="$1"
    
    while read -r arg1 rest; do
        case "$arg1" in
            peer)
                ip="${rest% *}" # prune everything after first space
                ;;
            pre-shared-secret)
                if [ "$rest" = "$secret" ]; then
                    echo "$ip"
                    exit # don't bother reading rest of file
                fi
                ;;
        esac
    done
    

    用法:

    command_string | getPeerIP 'Secret Password'
    

    【讨论】:

    • 也许不是一行但有效,我承认它更容易理解。感谢@tshiono 为 RegEx 提供的艰难!
    猜你喜欢
    • 1970-01-01
    • 2023-01-13
    • 2018-08-20
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多