如何在文本文件中查找 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
我想将这三个命令的管道替换为一个。我认为仅使用 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