如何在文本文件中查找 IPv4 地址和子网的所有匹配项,并仅使用一个命令逐行打印具有给定前缀的匹配项?

How to find all matches of IP v4 addresses and subnets in a text file and print matches line by line with given prefix using only one command?

我想将这三个命令的管道替换为一个。我认为仅使用 awk 或 sed 就可以获得类似的结果。

当前使用 cat、greep 和 awk 的解决方案

cat textfile | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}(\/[0-9]{1,2}|)" | awk '{print "prefix "[=10=]}'

文本文件示例:

192.168.1.1 10.100.20.0/24 some text  2a05:d014:d13:26aa:f493:ef87:bb60:d85f
10.15.12.11, text "10.10.0.0/16" =25.0.0.0/12 etc

输出:

prefix 192.168.1.1
prefix 10.100.20.0/24
prefix 10.15.12.11
prefix 10.10.0.0/16
prefix 25.0.0.0/12

对于任何给定的 shell 命令,如果命令可以采用文件参数或 command < file(或等效的 < file command 如果你喜欢在命令的左边而不是右边指定文件名)不管命令是否可以接受文件参数。

将 GNU awk 用于 multi-char RS 和 RT:

$ awk -v RS='([0-9]{1,3}[.]){3}[0-9]{1,3}(/[0-9]{1,2})?' 'RT{print "prefix", RT}' file
prefix 192.168.1.1
prefix 10.100.20.0/24
prefix 10.15.12.11
prefix 10.10.0.0/16
prefix 25.0.0.0/12

或任何 awk:

$ awk '{
    while ( match([=11=],"([0-9]{1,3}[.]){3}[0-9]{1,3}(/[0-9]{1,2})?") ) {
        print "prefix", substr([=11=],RSTART,RLENGTH)
        [=11=] = substr([=11=],RSTART+RLENGTH)
    }
}' file
prefix 192.168.1.1
prefix 10.100.20.0/24
prefix 10.15.12.11
prefix 10.10.0.0/16
prefix 25.0.0.0/12

我对你的正则表达式所做的唯一更改是清理而不是功能 - 你不需要在括号表达式中转义 . 也不需要在正则表达式中转义 /(除非你正在使用/s 作为正则表达式分隔符,我们不是)我只是认为 (/[0-9]{1,2})?(/[0-9]{1,2}|)

更清楚

使用sed

$ sed -z 's/["=]\?\([0-9][^[:space:],"]*\)[a-z ",\n]*/prefeix \n/g' input_file
prefeix 192.168.1.1
prefeix 10.100.20.0/24
prefeix 10.15.12.11
prefeix 10.10.0.0/16
prefeix 25.0.0.0/12