【发布时间】:2010-10-30 02:58:58
【问题描述】:
我是使用 Linux 的初学者,我有一个输入文件,其内容如下:
00.11.11.11.11.11
177.22.22.22
一行以太网地址和一行IP地址, 如何将此文件转换为:
IP: 177.22.22.22 MAC: 00.11.11.11.11.11
我认为 awk 会这样做,但我不知道该怎么做。有什么想法吗?
谢谢!
【问题讨论】:
标签: awk
我是使用 Linux 的初学者,我有一个输入文件,其内容如下:
00.11.11.11.11.11
177.22.22.22
一行以太网地址和一行IP地址, 如何将此文件转换为:
IP: 177.22.22.22 MAC: 00.11.11.11.11.11
我认为 awk 会这样做,但我不知道该怎么做。有什么想法吗?
谢谢!
【问题讨论】:
标签: awk
也可以用 'sed' 来完成,但是既然你要求 'awk',那就应该是 'awk'。
awk '/^([0-9]+\.){5}[0-9]+$/ { mac = $1 }
/^([0-9]+\.){3}[0-9]+$/ { printf "IP: %s MAC: %s\n", $1, mac }' data
(以前的版本:
awk '/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ { mac = $1 }
/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ { printf "IP: %s MAC: %s\n", $1, mac }'
不太好,因为写出来的重复,而不是计数重复。)
第一行匹配 MAC 地址,并在变量 mac 中保存最新的。第二个匹配 IP (IPv4) 地址并打印当前 MAC 地址和 IP 地址。
如果您有杂散的前导或尾随空白,或其他杂散字符,您需要适当地使正则表达式更复杂。
【讨论】:
cat file | awk '{print "IP:", $1, "MAC:", $2}' 可以达到同样的效果。
【讨论】:
paste - - < input_file | awk '{print "IP: " $2 " MAC: " $1}'
【讨论】:
awk -vRS='{print "IP:", $2, "MAC:", $1;}'
相当于
awk 'BEGIN{RS="";}{print "IP:", $2, "MAC:", $1;}'
这也适用于多个输入记录:
"
00.11.22.33.44.55
123.45.67.89
11.22.33.44.55.66
11.22.33.99
"
->
"
IP:123.45.67.89 MAC:00.11.22.33.44.55
IP:11.22.33.99 MAC:11.22.33.44.55.66
"
【讨论】:
{ if(mac) { print "IP:", $0, "MAC:", mac; mac = 0 } else mac = $0 }
【讨论】:
awk -F"." 'NF>4{m=$0}NF==4{print "IP:"$0" MAC:"m}' file
【讨论】:
这里有一个sed 版本:
sed 's/^/MAC: /;x;N;s/\n/IP: /;G;s/\n/ /' inputfile
如果文件中有不止一对行:
sed 's/^/MAC: /;x;s/.*//;N;s/\n/IP: /;G;s/\n/ /' inputfile
【讨论】: