2017-08-01 43 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並打印其行。