如何使用unix命令编辑特定列?

时间:2017-02-06 23:37:27

标签: shell unix awk sed

我想编辑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

提前致谢。

4 个答案:

答案 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/'
相关问题