处理ifconfig和主机名输出,并在多行中将其成帧

时间:2018-06-27 13:59:59

标签: bash shell awk grep

我正在尝试从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 

请发表一些看法

1 个答案:

答案 0 :(得分:3)

  

我正在尝试从100台计算机中过滤远程计算机的mac地址,IP和主机名。

  1. 机器的Mac地址,来自herecat /sys/class/net/eth0/address
  2. 您拥有hostname实用程序,为什么不只是hostname -i?您可以解析ifconfig | grep inet | awk '{print $2}' | sed 's/addr://',并希望所有计算机上的ifconfig版本都相同(某些ifconfig版本返回inet <ip>,有些返回inet addr:<ip>,就像您一样)。
  3. 带有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' --

还有this hurts my eyes

for i in `cat IP`; then