[英]Parse ifconfig with Bash to get current IP address (wifi or ethernet)
[英]Parse ifconfig to get only my IP address using Bash
我想編輯 bashrc 文件以運行一個名為“myip”的簡單函數。 正如您可能猜到的,函數 myip 只打印我機器的內部 IP 地址。
就我開始工作而言,這是腳本:
ifconfig en1 | awk '{ print $2}' | sort
這得到了我的輸出:
10.0.0.12
options=1<PERFORMNUD>
flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST>
fe80::daa2:5eff:fe96:ba2f%en1
d8:a2:5e:96:ba:2f
autoselect
active
我在 Mac OS X 上工作。
我怎樣才能做到這一點?
以下兩者都在這里工作(CentOS 5)。
ip addr show eth0 | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}'
ifconfig eth0 | awk '/inet addr/ {gsub("addr:", "", $2); print $2}'
對於 OS X(至少v10.11 (El Capitan)):
ifconfig en0 | awk '$1 == "inet" {print $2}'
這是獲取 IP 地址的更“不可知”的方式,無論您使用 *nix 系統(Mac OS、Linux)、接口名稱,甚至您的語言環境配置:
ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d:
如果您有多個活動 IP,將在單獨的一行中列出每個 IP。 如果您只想要第一個 IP,請添加| head -n1
| head -n1
到表達式:
ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" \
| grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1
如果您想要特定接口的 IP 地址,請將第一個表達式ifconfig
替換為ifconfig INTERFACENAME
,例如ifconfig eth0 | grep -E ...
ifconfig eth0 | grep -E ...
.
最后,您注意到腳本所做的一件事是省略系統管理員和開發人員“localhost”調用的 IP 127.0.0.1
,但考慮到某些應用程序還可能添加具有 IP 的虛擬網絡設備,這可能是如果未添加到省略列表,則返回,例如。 Docker 添加了一個虛擬接口docker0
,它通常具有 IP 172.17.0.1
,如果您想省略此 IP 以及“localhost”,請更改表達式grep -v 127.0.0.1
以考慮另一個 IP。 在這種情況下(省略 localhost 和 docker),最終表達式將是:
ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v '[127.0|172.17].0.1' | awk '{ print $2 }' | cut -f2 -d: | head -n1
這些是本頁中提到的一些在某些情況下失敗的示例以及原因:
ip route ...
: ip
命令未安裝在 OSX 機器中。hostname -I
: -I
選項在 OSX 中無效。ifconfig en0 ...
:Linux 和 OSX 中的接口名稱( eth0
、 en0
)不同,在 Linux 中,名稱還取決於接口類型( ethX用於以太網連接, wlanX用於無線等)。python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
:這在 Ubuntu Linux 14.04 中得到了127.0.1.1
(一個環回 IP ),所以不起作用。ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '
ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '
:Geograph 的帖子更接近,但在某些未配置LANG=en
Linux 發行版中不起作用,因為grep
查找的文本inet addr:
是在其他語言環境中使用不同文本輸出的,而在 Mac OS 中,該標簽也不同。在 eth0 的情況下,以下對我有用。 嘗試用相同的邏輯調整它。
ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
好吧,經過幾個小時的掙扎,我終於做對了:
ifconfig en1 | awk '{ print $2}' | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"
我遺漏的最后一部分只是從我的列表中 grep 一個 IP 地址模式。
您可以使用awk
來執行inet
行的選擇和 IP 地址的解析,如下所示:
$ ip addr ls docker0 | awk '/inet / {print $2}' | cut -d"/" -f1
172.17.42.1
在上面的示例中,將設備句柄eth0
替換為docker0
。 另外,如果你想要一個純粹的AWK實現,你可以像這樣進行“切割”:
$ ip addr ls docker0 | awk '/inet / {split($2, ary, /\//); print ary[1]}'
172.17.42.1
使用 BASH4+ 的 IPv4 示例
示例 1 ,使用主機名:
hostname -I|cut -d" " -f 1
示例 2,設備是已知的(並且永遠不會改變):
ifconfig ens5 | grep "inet" | awk '{print $2}' | sed 's/[^0-9.]*//g'
示例 3 ,不要現在的設備(例如 eth0、eth1、enp0s23 或 wpxxx):
ip a | awk 'BEGIN{ "hostname -I|cut -d\" \" -f 1" | getline ip} $2 ~ ip {print "Device: "$NF " IP: "$2}'
例4 ,想要網絡IP地址:
wget -q -O /dev/stdout http://checkip.dyndns.org/ | cut -d":" -f2 | cut -d \< -f1
請享用。
除了解析 ifconfig 之外,還有另一種簡單的方法來獲取 IP 地址。
hostname -I -I, --all-ip-addresses all addresses for the host -i, --ip-address addresses for the hostname
參考: http : //linux.die.net/man/1/hostname
例子:
[ec2-user@terraform ~]$ 主機名 -I
10.10.10.10
無需在 Bash 中進行不可移植的 ifconfig 解析。 這是 Python 中的一個簡單的單行代碼:
python -c 'import socket; print(socket.gethostbyname(socket.gethostname()))'
如果您只是在尋找“inet”而不是“inet6”,這對我有用:
/usr/bin/ifconfig eth0 | grep --word-regexp inet | awk '{print $2}'
“--word-regexp”將使grep查找整個單詞“inet”而不匹配單詞的部分,即“inet”不會匹配“inet6” - “inet”只會匹配其中包含“inet”的行.
你也可以試試這個
user@linux:~$ cat script.sh
ifconfig | grep ad.*Bc | cut -d: -f2 | awk '{ print $1}'
user@linux:~$
輸出
user@linux:~$ ./script.sh
192.168.1.1
10.0.1.1
user@linux:~$
請注意,ifconfig 輸出可能會因您的 linux 版本而異。 因此,您可能希望相應地更改腳本。
順便說一句,這是我的 ifconfig 輸出
user@linux:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:10
inet addr:192.168.1.1 Bcast:192.168.56.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:112 errors:0 dropped:0 overruns:0 frame:0
TX packets:93 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14616 (14.2 KiB) TX bytes:17776 (17.3 KiB)
eth1 Link encap:Ethernet HWaddr 00:00:00:00:00:11
inet addr:10.0.1.1 Bcast:10.0.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
user@linux:~$
類似於 JSR,但awk
和cut
的順序相反:
my_ip=$(ifconfig en1 | grep 'inet addr' | awk '{print $2}' | cut -d: -f 2)
echo ${my_ip}
這對我有用:
ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'
也適用於 VDS/VPS 的代碼:
ifconfig | grep -A2 "venet0:0\|eth0" | grep 'inet addr:' | sed -r 's/.*inet addr:([^ ]+).*/\1/' | head -1
或者
ifconfig | grep 'inet addr:' | grep -v 127.0.0.1 | head -n1 | cut -f2 -d: | cut -f1 -d ' '
采取補丁的答案,使其更一般,
即:跳過所有內容直到第一個數字。
ifconfig eth0 | awk '/inet addr/{sub(/[^0-9]*/,""); print $1}'
或者甚至更好:
ifconfig eth0 | awk '/inet /{sub(/[^0-9]*/,""); print $1}'
使用 Perl 正則表達式:
ifconfig eth0 | grep -oP '(?<= inet addr:)[^ ]+'
說明:grep -oP 使用 Perl 正則表達式搜索完全匹配。
“棘手”的部分是正則表達式本身;
1. (?<= inet addr:)
表示 - 字符串inet addr:
位於我們要查找的內容的左側。
2. [^ ]+
(請注意 ^ 后面的空格)- 表示查找所有內容,直到第一個空格為止- 在我們的示例中,它是 IP 地址。
用:
ifconfig enops3 | greb broadcast | cut -d " " -f10
其中enops3
是接口名稱。
此代碼輸出所有網絡連接(環回除外)的 IP 地址,並且可以在大多數OS X 和 Linux 版本之間移植。
它對於在以下機器上運行的腳本特別有用:
腳本是:
/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2
這可以在腳本中分配給一個變量,如下所示:
myip=$(/sbin/ifconfig -a | awk '/(cast)/ {print $2}' | cut -d: -f2)
腳本可以通過使用循環處理結果來處理可能的多個地址,如下所示:
if [[ -n $myip ]]; then
count=0
for i in $myip; do
myips[count]=$i # Or process as desired
((++count))
done
numIPaddresses=$count # Optional parameter, if wanted
fi
筆記:
在嘗試了一些解決方案后,我發現這最方便,將其添加到您的別名中:
alias iconfig='ifconfig | awk '\''{if ( $1 >= "en" && $2 >= "flags" && $3 == "mtu") {print $1}; if ( $1 == "inet" || $1 == "status:"){print $0};}'\''|egrep "en|lo|inet"'
輸出如下所示:
shady@Shadys-MacBook-Pro:xxxx/xxx ‹dev*›$ iconfig lo0: inet 127.0.0.1 netmask 0xff000000 en0: inet 10.16.27.115 netmask 0xffffff00 broadcast 10.16.27.255 en1: en2: en5: inet 192.168.2.196 netmask 0xffffff00 broadcast 192.168.2.255
在 grep ifconfig
遇到麻煩之后,我找到了一個包裝庫來簡化我的生活
pip install my_ip
mip
ifconfig eth0 | awk '/inet addr/{sub("addr:",""); print $2}'
一個簡單的 AWK + Bash 腳本示例,它可以提供如何解析命令輸出並將語法混合在一起的總體思路。
完整代碼位於: https : //gist.github.com/darkphase/67d7ec22d47dbebd329e
BEGIN { RS = "" ; FS = "\n" } # Change separator characters
{
while ( "'"$cmd"'" | getline ){
# print $0
if ( $1 !~ /LOOPBACK/ ){
split($1,arr," ")
print "'"$blue"'"arr[1]"'"$reset"'"
for(i = 1; i <= NF; i++) { # Loop through fields (this case lines)
split($i,arr," ")
switch ( arr[1] ) {
case "inet":
print "'"$red"'" "IPV4:" "'"$reset"'" "\n IP: " "'"$yellow"'" arr[2] "'"$reset"'" "\n NM: "arr[4]"\n BC: "arr[6]
break
case "inet6":
print "'"$red"'" "IPV6:" "'"$reset"'" "\n IP: "arr[2]"\n PL: "arr[4]
break
case "ether":
print "'"$red"'" "MAC: " "'"$reset"'" arr[2]
break
default:
}
}
print ""
}
}
}'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.