Shell

有沒有一種簡單的方法來以程式方式提取 IP 地址?

  • January 13, 2017

有沒有一種簡單的方法來以程式方式提取 IP 地址,而無需繁瑣的解析ifconfig?我不介意簡單的命令輸出處理sed用於執行此操作,但不處理來自/etc某個地方的多行文件。我要做的是修改我.bashrc的以在問候消息中顯示主機的 IP 地址。我正在使用Ubuntu 12.04但決定在這里而不是 Ubuntu 論壇發帖,因為我認為這不是特定於發行版的。

筆記

  1. NIC 設備句柄

下面的範例假設網路介面是名為 的無線網卡wlan0。在範例中針對您的特定情況調整此位。例如,如果它是有線 NIC 卡,那麼它很可能是eth0. 2. IPv4 -(網際網路協議版本 4)

這些範例也返回 IPv4 地址。大多數人認為是他們的“IP 地址”的“虛線四邊形”。

例如:

inet addr:192.168.1.20  Bcast:192.168.1.255  Mask:255.255.255.0
  1. IPv6 -(網際網路協議版本 6)

如果您的系統配置為支持 IPv6,您將在輸出中看到“點四邊形”以及 IPv6 IP 地址ifconfig

例如:

inet6 addr: fe80::226:c7ff:fe85:a720/64 Scope:Link

下面的命令明確忽略了這一點,但可以很容易地調整以獲取此資訊。

解決方案(使用ifconfig

有很多方法可以做到這一點。例如,您可以使用此awk腳本解析出無線 LAN NIC (wlan0) 的 IP 地址:

$ ifconfig wlan0 | grep "inet " | awk -F'[: ]+' '{ print $4 }'
192.168.1.20

您可以這樣做並使其更緊湊:

$ ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}'
192.168.1.20

您也可以使用perl

$ ifconfig wlan0 | perl -nle'/t addr:(\S+)/&&print$1'
192.168.1.20

Perl 範例盡可能緊湊。

有無數其他方法可以做到這一點,這些只是幫助您入門的幾個範例。

編輯#1

一些額外的註釋和評論。@StephaneChazelas 證明有一個更緊湊的版本使用grep

$ ifconfig wlan0|grep -Po 't addr:\K[\d.]+'
192.168.1.20

此解決方案利用grep’ 在較新版本中使用 PCRE(Perl 正則表達式)的能力,以及它的-o開關以返回與正則表達式匹配的內容。

解決方案(使用ip

正如評論中還提到的那樣,在將ifconfig多個 IP 地址分配給網路設備的系統上使用可能會很麻煩,因為它只返回第一個。所以ip在這些情況下最好使用該命令。

例如:

$ ip addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20

您還可以告訴ip您只顯示給定網路介面的 IPv4 資訊。在這種情況下,我們只查看名為的介面wlan0

$ ip -f inet addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20

參考

引用自:https://unix.stackexchange.com/questions/87468