bash如何从ifconfig中提取iface inet和mask

时间:2018-03-27 21:41:22

标签: bash

任何人都可以帮助过滤enp37s0 Link encap:Ethernet HWaddr 2c:41:38:15:41:30 inet addr:192.168.0.105 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::89be:e3f9:b746:19ed/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:4593332 errors:0 dropped:0 overruns:0 frame:0 TX packets:2313662 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:6506620971 (6.5 GB) TX bytes:182579364 (182.5 MB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:9574 errors:0 dropped:0 overruns:0 frame:0 TX packets:9574 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1100854 (1.1 MB) TX bytes:1100854 (1.1 MB) wlo1 Link encap:Ethernet HWaddr d0:df:9a:6c:7c:1d inet addr:192.168.0.103 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::225d:a288:5fa7:2237/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:124147 errors:0 dropped:0 overruns:0 frame:0 TX packets:2681 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:32988267 (32.9 MB) TX bytes:266523 (266.5 KB) 的信息 我得到的信息是

<div class="A">
    <div>A</div>
</div>

我想得到。

  1. enp37s0:192.168.0.105/255.255.255.0
  2. lo:127.0.0.1/255.0.0.0
  3. wlo1:192.168.0.103/255.255.255.0

2 个答案:

答案 0 :(得分:0)

语法将根据您使用的操作系统而改变,但您可以使用一些sed命令来获取所需的输出。例如,我的Arch Linux系统上的命令是ifconfigf而不是p),我的输出格式有点不同。但是这里应该适用于你的系统:

ipconfig | tr '\n' '~' | sed 's/~~/\n/g' | sed 's/~/ /g' | sed -E 's/^\s*(\S+)\s+.*\s+inet\s+(\S+)\s.*$/\1 \2/g'

我们在这里做了几件事:

  1. 将所有换行替换为一些未使用的字符,此处为~,因为您的接口名称(enp37s0)和IP地址(192.168.0.105)位于不同的行上,我们需要将它们合并到同一行< / LI>
  2. ~~(可能是两个连续的换行符 - 接口之间的分隔符)替换为单个换行符。这将有效地使sed在其余步骤中分别对每个界面进行操作
  3. 用空格替换~(本来是一个换行符);这可以确保我们不会无意中加入原始输出的任何部分(例如,我们可能会将前两行中的30inet连接在一起,但我们需要30 inet,因为我们正在寻找{ {1}}
  4. 最后,主要部分,我们在每一行中提取第一个单词,然后我们查找inet单词,并在同一行后立即提取单词。我们也会丢弃第一个单词之后和inet之前的所有内容,以及inet之后单词之后的所有内容。这里的“单词”表示由空格分隔的任何内容。正则表达式中的inet与空格匹配,\s匹配任何非空格的内容,因此\S找到我们的第一个单词,^\s*(\S+)\s+除去后面的任何内容,{{1}找到.*及其后面的单词,\s+inet\s+(\S+)\s删除任何内容到行尾。
  5. 这将在您的情况下产生以下内容:

    inet

    如果你想看看每个步骤的作用,你当然可以执行部分​​命令。

    删除.*$和/或将enp37s0 addr:192.168.0.105 lo addr:127.0.0.1 wlo1 addr:192.168.0.103 添加到结果中作为练习留给读者,因为可以使用类似的技巧。

答案 1 :(得分:0)

接受挑战:-)

试试这个单行:

<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>

在我的Debian上生成类似的东西:

for ip in $(hostname -I | grep -Eo '([0-9]*\.){3}[0-9]*'); do echo ""$(ifconfig | grep -B1 "inet addr:"$ip | cut -d " " -f1 | tr -d " ")" : "$ip"/"$(ifconfig | grep "inet addr:"$ip | grep -Eo 'Mask:?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*') ; done;    

如果您有兴趣,可以参考一些细节:

wlan1 : 192.168.1.116/255.255.255.0
docker_gwbridge : 172.18.0.1/255.255.0.0
br-2c830dcde04d : 172.25.0.1/255.255.0.0
br-d6bc6df716ef : 172.21.0.1/255.255.0.0
br-d6fccd14dfad : 172.19.0.1/255.255.0.0
br-df4c2b24c7c0 : 172.24.0.1/255.255.0.0
docker0 : 172.17.0.1/255.255.0.0
br-ef0e82befd79 : 172.22.0.1/255.255.0.0
br-fad2fced45f8 : 172.20.0.1/255.255.0.0

for ip in $(hostname -I | grep -Eo '([0-9]*\.){3}[0-9]*'); do 输出

中循环遍历IPv4地址
hostname

ifconfig | grep -B1 "inet addr:"$ip | cut -d " " -f1 | tr -d " ") 中取一条匹配的行和上面的那一行,然后将该行的第一个单词放在IP地址之上......这应该是接口的名称

ifconfig

再次获取该匹配行并搜索带有“Mask:”的标记,然后提取掩码

好吧,我知道,它不是纯粹的bash,可能不适用于所有操作系统变种,甚至ifconfig上的纯sed / grep,但是......编写它很有趣!