我正在尝试从100台计算机中过滤远程计算机的mac地址,IP和主机名。最初,我使用以下命令捕获信息。
$for i in `cat IP`;do in ssh root@$IP "ifconfig eth0 && hostname " ;done
eth0 Link encap:Ethernet HWaddr 00:MN:77:TR:XX:ZZ
inet addr:192.168.122.25 Bcast:192.168.122.255
Mask:255.255.224.0
test.com-112304
eth0 Link encap:Ethernet HWaddr 00:TT:77:MM:XX:YY
inet addr:192.168.122.22 Bcast:192.168.122.255
Mask:255.255.224.0
test.com-11035
最初,输出重定向到一个文件。从他们我需要处理上述格式的输出。
我可以按以下方式完成IP和mac的打印
$cat input | awk '/HWaddr/{printf $NF;printf " ";getline;print $2;}' | cut -c1-18,24-
00:MN:77:TR:XX:ZZ 192.168.122.25
00:TT:77:MM:XX:YY 192.168.122.22
实际上我想在输出中包括主机名,如下所示
00:MN:77:TR:XX:ZZ 192.168.122.25 test.com-112304
00:TT:77:MM:XX:YY 192.168.122.22 test.com-11035
test.com将是所有主机名的通用名称。我尝试将两个输出都重定向到两个变量中,并调用如下,但没有运气。
a=`cat input | awk '/HWaddr/{printf $NF;printf " ";getline;print $2;}' | cut -c1-18,24-`
b=`grep test.com input`
echo $a $b | xargs -n2
请发表一些看法
答案 0 :(得分:3)
我正在尝试从100台计算机中过滤远程计算机的mac地址,IP和主机名。
cat /sys/class/net/eth0/address
hostname
实用程序,为什么不只是hostname -i
?您可以解析ifconfig | grep inet | awk '{print $2}' | sed 's/addr://'
,并希望所有计算机上的ifconfig版本都相同(某些ifconfig版本返回inet <ip>
,有些返回inet addr:<ip>
,就像您一样)。hostname
的主机名放在一起:
echo $(cat /sys/class/net/eth0/address) $(ifconfig eth0 | grep inet | awk '{print $2}') $(hostname)
为某个文件中的每一行执行命令是xargs的工作,请记住正确地转义参数:
cat IP | xargs -n1 -I{} ssh root@{} 'echo $(cat /sys/class/net/eth0/address) $(ifconfig eth0 | grep inet | awk '\''{print $2}'\'' | sed '\''s/addr://'\'') $(hostname)'
如果您确实有100台计算机,ansible可能会让您感兴趣。
如果您确实拥有该“输入”文件,并且无法更改它,则可以这样解析它:
sed 's/eth0/#eth0/' input \
| xargs -d'#' -n1 -- bash -c '{ echo "$1" | grep HWaddr | awk "{print \$5}"; echo "$1" | grep inet | awk "{print \$2}" | sed "s/addr://"; echo "$1" | grep "^test.com"; } | tr "\n" " "; echo' --
for i in `cat IP`; then