我正在尝试从openwrt中的/tmp/dhcp.lease解析dhcp.lease文件。
root@OpenWrt:/# 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 devices
,MAC address
,IP address
和Device 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这样的快速方法?任何示例代码?
答案 0 :(得分: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 :(得分: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并遍历打印每个条目的阵列。
答案 2 :(得分:0)
除awk
之外,您可以将grep
与regex
一起使用,并使用临时文件保存匹配的输出,以进一步计算其行并将其显示为这样例如:
~$ 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
说明:
o
匹配行的匹配(非空)部分并使用E
xtended regexp,请参阅man page。/tmp/testFile
。/tmp/testFile
计算wc
的行并打印其行。