我想编辑IP编号的第四列,如下例所示:
输入文件:
$ cat file
server01 SW Y as.fdsas:#10.0.0.3[12345]<OS>server01</OS>
server02 SW Y as.fdsas:#10.0.0.2[12345]<OS>server02</OS>
server03 SW Y as.fdsas:#10.0.0.3[12345]<OS>server03</OS>
期望的输出:
server01 SW Y 10.0.0.3
server02 SW Y 10.0.0.2
server03 SW Y 10.0.0.3
提前致谢。
答案 0 :(得分:2)
我个人非常喜欢Perl作为我的命令行正则表达式工具,几乎存在于所有Unix shell中。
这适用于大多数情况
command | perl -pe 's/[^\s]+?(\d+\.\d+\.\d+\.\d+)[^\s]+/$1/g'
它的工作原理是匹配ip和垃圾之前和之后,IP = \d+\.\d+\.\d+\.\d+
,垃圾前/后(非空白字符)[^\s]+
(?
=贪婪)并替换它由匹配的IP地址
答案 1 :(得分:2)
假设:
$ cat file
server01 SW Y as.fdsas:#10.0.0.3[12345]<OS>server01</OS>
server02 SW Y as.fdsas:#10.0.0.2[12345]<OS>server02</OS>
server03 SW Y as.fdsas:#10.0.0.3[12345]<OS>server03</OS>
然后,以下命令将为您提供所需的输出:
$ sed 's/as.fdsas:#//g' file | sed 's/\[12345\]//g' | sed 's/\<OS\>server..\<\/OS\>//g'
server01 SW Y 10.0.0.3
server02 SW Y 10.0.0.2
server03 SW Y 10.0.0.3
注意:
它不是很通用,所以如果你的输出看起来有变化,那么它就需要修改。此外,如果您希望将其存储在文件中,则可以向其添加| cat > filename
,如下所示:
$ sed 's/as.fdsas:#//g' file | sed 's/\[12345\]//g' | sed 's/\<OS\>server..\<\/OS\>//g' | cat > f1
$ cat f1
server01 SW Y 10.0.0.3
server02 SW Y 10.0.0.2
server03 SW Y 10.0.0.3
答案 2 :(得分:1)
假设:
$ cat file
server01 SW Y as.fdsas:#10.0.0.3[12345]<OS>server01</OS>
server02 SW Y as.fdsas:#10.0.0.2[12345]<OS>server02</OS>
server03 SW Y as.fdsas:#10.0.0.3[12345]<OS>server03</OS>
您可以使用awk获取字段:
awk '{split($4,arr,/[#\[]/); printf "%-23s %s %s %s\n" ,$1, $2, $3, arr[2]}' file
server01 SW Y 10.0.0.3
server02 SW Y 10.0.0.2
server03 SW Y 10.0.0.3
答案 3 :(得分:0)
Sed在这里很有用:
sed 's/[\.a-z]*:#\([0-9\.]*\)\[.*/\1/'