gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:44:34 25 4
gpt4 key购买 nike

我想用一个命令替换这个由三个命令组成的管道。我认为仅使用 awk 或 sed 就可以达到类似的结果。

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

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

文本文件示例:

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 命令,cat file | command始终可以替换为 command file如果命令可以接受文件参数或 command < file (或者等效的 < file command 如果您喜欢在命令左侧而不是右侧指定文件名)无论命令是否可以采用文件参数。

使用 GNU awk 实现多字符 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($0,"([0-9]{1,3}[.]){3}[0-9]{1,3}(/[0-9]{1,2})?") ) {
print "prefix", substr($0,RSTART,RLENGTH)
$0 = substr($0,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}|) 更清晰

关于awk - 如何仅使用一个命令在文本文件中查找 IPv4 地址和子网的所有匹配项并使用给定前缀逐行打印匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71101734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com