我尝试用巴塞尔解析我的 dhcpd.lease 文件。典型的条目如下所示:
lease 192.168.20.4 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
uid 00:00:00:00:00:00;
client-hostname "examle-workstation1";
}
Run Code Online (Sandbox Code Playgroud)
我得到的所有信息都是 MAC,我想要的是 IP 和客户端主机名。但也许,没有客户端主机名。该条目如下所示:
lease 192.168.20.5 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
}
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是 grep 租赁属性、硬件以太网属性和 uid 属性,并将它们全部放在一行上。然后解析它。
但我的问题是,我有一个大文件,在许多文件中分配了许多条目。树看起来像这样:
dhcpd-leases
-- 192.168.20.0
-- 192.168.30.0
-- 192.168.40.0
[...]
Run Code Online (Sandbox Code Playgroud)
我得到的所有东西都是从另一个文件解析到列表中的 MAC。所以我从这个列表开始,想用我的 MAC 来 grep 属性 ip, mac:
for ENTRY in $MACLIST
do
VAR$(cat "dhcpd-leases/10.148.$NETWORK.2/dhcpd.leases" | grep -E "$MAC|lease|client-hostname")
echo $VAR
done
Run Code Online (Sandbox Code Playgroud)
但这是因为 $VAR 中的许多条目和文件我无法正确解析它。
有人可以帮忙吗?
最好的问候彼得
假设您的 maclist 文件如下所示(例如,只有一个条目)
$ cat maclist
00:00:00:00:00:01
Run Code Online (Sandbox Code Playgroud)
和你的租约文件是这样的
$ cat file
lease 192.168.20.4 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
uid 00:00:00:00:00:00;
client-hostname "examle-workstation1";
}
lease 192.168.20.5 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:00;
}
lease 192.168.20.6 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 00:00:00:00:00:01;
uid 00:00:00:00:00:01;
client-hostname "examle-workstation2";
}
lease 192.168.20.7 {
starts 6 2009/06/27 00:40:00;
ends 6 2009/06/27 12:40:00;
hardware ethernet 01:00:00:00:00:00;
}
Run Code Online (Sandbox Code Playgroud)
你可以试试这个
awk 'BEGIN{
while( (getline line < "maclist") > 0){
mac[line]
}
RS="}"
FS="\n"
}
/lease/{
for(i=1;i<=NF;i++){
gsub(";","",$i)
if ($i ~ /lease/) {
m=split($i, IP," ")
ip=IP[2]
}
if( $i ~ /hardware/ ){
m=split($i, hw," ")
ether=hw[3]
}
if ( $i ~ /client-hostname/){
m=split($i,ch, " ")
hostname=ch[2]
}
if ( $i ~ /uid/){
m=split($i,ui, " ")
uid=ui[2]
}
}
if ( ether in mac ){
print "ip: "ip " hostname: "hostname " ether: "ether " uid: "uid
}
} ' file
Run Code Online (Sandbox Code Playgroud)
输出
$ ./shell.sh
hostname: "examle-workstation2" ether: 00:00:00:00:00:01 uid: 00:00:00:00:00:01
Run Code Online (Sandbox Code Playgroud)