使用管道命令配合正規表示式提取Linux下指定網絡卡的IP地址

我不想直接把命令貼出來並告訴你:“這樣做就對了”,下面我會一點點帶你把具體的命令分析出來。
一般情況下在Linux下檢視網絡卡IP地址一般都用什麼命令?是下面這一條,對吧。

[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:70:91:62
inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe70:9162/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:58059 errors:0 dropped:0 overruns:0 frame:0
TX packets:13478 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4629291 (4.4 MiB) TX bytes:2488172 (2.3 MiB)
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:16436 Metric:1
RX packets:260 errors:0 dropped:0 overruns:0 frame:0
TX packets:260 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:35416 (34.5 KiB) TX bytes:35416 (34.5 KiB)

命令返回了好長一大串資訊,可以發現ifconfig命令預設是返回所有網絡卡的資訊的,也包括本地換回口,那如何指定其只返回某一張網絡卡的資訊呢?可以寫成下面這樣。
ifconfig 接網絡卡名
本實驗中,我只獲取eth0的網絡卡資訊。

[root@localhost ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 08:00:27:70:91:62
inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe70:9162/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:58090 errors:0 dropped:0 overruns:0 frame:0
TX packets:13494 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4631879 (4.4 MiB) TX bytes:2490700 (2.3 MiB)

觀察上面的輸出資訊,會發現,IP地址是在“inet addr:”這個關鍵字後面輸出的,那我們的第一步就是使用管道命令把含有這個關鍵字的行給提取出來。

[root@localhost ~]# ifconfig eth0 | grep "inet addr:"
inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0

接下來要怎麼做呢?
觀察上方的輸出,可以發現其是由好幾個部分透過空格符來組合在一起的,這樣我們就可以使用awk命令來過濾出第二個欄位。

[root@localhost ~]# ifconfig eth0 | grep "inet addr:" | awk '{print $2}'
addr:192.168.1.11

已經離成功很近了,現在只需要去除多餘的“addr:”這個字串即可,直接在字串中刪除一段字串這個命令我沒找到,那就曲線救國唄,咱將排除“addr:”這個字串的字串輸出出來就好(有點繞口)。數一下“addr:”這個字串一共有五個字元,那咱們就從第六個字元開始輸出,一直輸出到行尾就可以整理出IP地址啦!

[root@localhost ~]# ifconfig eth0 | grep "inet addr:" | awk '{print $2}' | cut -c 6-
192.168.1.11