2017-08-01 42 views
-1

我想在openwrt中解析/tmp/dhcp.lease中的dhcp.lease文件。如何使用shell脚本从dhcp.lease文件中提取IP地址,MAC地址和名称?

[email protected]:/# cat /tmp/dhcp.leases 

1568953482 70:B3:D5:14:D0:31 192.168.3.51 device1 01:70:B3:D5:14:D0:31 
2867821468 38:B8:EB:10:00:22 192.168.5.93 device2 01:38:B8:EB:10:00:22 
8984532872 00:01:0A:33:11:33 192.168.5.44 CISCOee 01:00:01:0A:33:11:33 

Where, 2nd column - MAC address , 3rd column - IP address and 4th column- Name 

我想运行一个shell脚本从这个名单dhcp.lease解析No of devicesMAC addressIP addressDevice Name

输出样本:

如果有3 device列表存在于dhpcp.lease文件, 我想打印像输出:

3 
70:B3:D5:14:D0:31/192.168.3.51/device1 
38:B8:EB:10:00:22/192.168.5.93/device2 
00:01:0A:33:11:33/192.168.5.44/CISCOee 

和 如果没有设备列表中发现问题,应返回

0 

我可以做无线简单的文件内容迭代?或者像sed/awk这样的快速方法?任何示例代码?

回答

1

awk命令可能会帮助你。

$ awk -v OFS='\n' '$2 ~ /[0-9A-Z]:/{n=n+1;a[n]=$2"/"$3"/"$4} END{print n==""?0:n; for(i in a)print a[i]}' /tmp/dhcp.leases 

简要说明,

  • 打印哪个$2匹配线对正则表达式[0-9A-Z]:
  • 节省匹配到n计数,并且还节省$2/$3/$3到阵列 a
  • 打印的匹配病例数n和数组a最后的值
1

以前的awk语句对我而言似乎过于复杂。以下更简单:

awk '{ dat[NR]=$2"/"$3"/"$4 } END { print NR;for (i=1;i<=NR;i++) { print dat[i] } }' /tmp/dhcp.lease 

租赁文件是固定的格式,只需要数据,总数将是记录数(NR变量)。将所需数据读入数组dat中,然后打印NR并循环打印每个条目的数组。

0

此外awk,您可以使用grepregex和使用临时文件在你保存进一步计算其线条与类似这样的例子显示它的匹配输出:

~$ cat /tmp/dhcp.leases | grep -oE "([0-9A-Z]{2}:){5}[0-9A-Z]{2}.*([0-9]{1,3}\.){3}[0-9]{1,3}.*[a-zA-Z]{3,}[0-9]+?" | tr ' ' '/' > /tmp/testFile 
~$ cat /tmp/testFile | wc -l; cat /tmp/testFile 

输出:

3 
70:B3:D5:14:D0:31/192.168.3.51/device1 
38:B8:EB:10:00:22/192.168.5.93/device2 
00:01:0A:33:11:33/192.168.5.44/CISCOee 

说明:

  • grep -oE:打印o只匹配匹配行的匹配(非空)部分,并使用E扩展正则表达式请参阅man page
  • 将输出重定向到临时文件/tmp/testFile
  • 使用wc来计算行/tmp/testFile并打印其行。