我正在运行以下命令来确定当前正在使用哪个网络接口。
networksetup -listallhardwareports | grep -C1 $(route get default | grep interface | awk '{print $2}')
我如何使用该命令并解析出该接口的设备名称,然后将其与Wi-Fi接口的设备名称进行比较?
所以我运行上面的命令,这就是我得到的:
Hardware Port: Ethernet
Device: en0
Ethernet Address: a8:60:b6:03:0a:97
这告诉我以太网端口或设备en0是计算机上的活动网络端口。我想将en0分配给一个变量,例如currentPort。
我还将运行以下命令:
networksetup -listallhardwareports
这将是以下结果:
Hardware Port: Ethernet
Device: en0
Ethernet Address: a8:60:xx:xx:xx:xx
Hardware Port: Wi-Fi
Device: en1
Ethernet Address: 2c:f0:xx:xx:xx:xx
由此,我想获取我的wifi的设备名称,在这种情况下为en1,并将其分配给另一个变量,例如wifiPort。
所以我应该有currentPort = en0和wifiPort = en1。我希望我可以再运行一条if then命令,说currentPort与wifiPort不相同,请做一件事;如果currentPort与wifiPort相同,请执行其他操作。
希望这有助于更好地解释事情。
根据您的帮助,这就是我现在正在使用的内容。 echo $ currentport和echo $ wifiport不会给我任何输出,并且使用if命令,无论我使用什么设备,它都会回显“它们是相同的”。
#!/bin/bash
#currentport=`grep -A3 'Ethernet' t6.txt | grep "Device"| awk -F": " '{print $2}'`
currentport=`echo $a|grep -A3 'Ethernet'| grep "Device"| awk -F": " '{print $2}'`
echo $currentport
#wifiport=`grep -A3 'Wi-Fi' t5.txt | grep "Device"| awk -F": " '{print $2}'`
wifiport=`echo $b|grep -A3 'Wi-Fi'| grep "Device"| awk -F": " '{print $2}'`
echo $wifiport
if [[ $currentport == $wifiport ]]
then
echo They are the same
else
echo They are different
fi
exit 0
答案 0 :(得分:0)
尝试一下:
对于currentport
:
假设您的networksetup
命令的输出存储在文件t6.txt
Hardware Port: Ethernet
Device: en0
Ethernet Address: a8:60:b6:03:0a:97
执行以下操作:
mayankp@mayank:~/ currentport=`echo $a|grep -A3 'Ethernet'| grep "Device"| awk -F": " '{print $2}'`
mayankp@mayank:~/ echo $currentport
en0
对于wifiport
:
假设您的networksetup
命令的输出存储在文件t5.txt
Hardware Port: Ethernet
Device: en0
Ethernet Address: a8:60:xx:xx:xx:xx
Hardware Port: Wi-Fi
Device: en1
Ethernet Address: 2c:f0:xx:xx:xx:xx
执行以下操作:
mayankp@mayank:~/ wifiport=`echo $b|grep -A3 'Wi-Fi'| grep "Device"| awk -F": " '{print $2}'`
mayankp@mayank:~/ echo $wifiport
en1
现在,您拥有两个变量:$currentport
和$wifiport
。
使用if
做你想做的事:
if [[ $currentport == $wifiport ]]
then
<do your stuff>
else
<do other stuff>
fi
让我知道这是否有帮助。
答案 1 :(得分:0)
我想我会避免使用所有这些管道,而只是在awk中这样做:
awk 'NR==FNR&&/interface/{i=$2} NR==FNR{next} index($0,"Device: "i)' \
<(route get default) \
RS= \
<(networksetup -listallhardwareports)
awk脚本首先解析route
命令的输出以确定要使用的接口,然后设置RS=
强制awk进入多行模式,从而允许index()
命令成为用作打印记录的条件。
如果只需要WiFi端口,则awk脚本甚至更简单,因为您无需解析route
命令:
awk 'index($0,"Hardware Port: Wi-Fi")' RS= <(networksetup -listallhardwareports)
如果您想比较结果,即确定您当前是否正在使用WiFi,则可以很容易地将所需的命令包装在进程替换中。
#!/bin/bash
currentPort=$(
awk '/interface/{print $2;exit}' <(route get default)
)
wifiPort=$(
awk 'index($0,"Hardware Port: Wi-Fi") {
sub(/.*Device: /,"");sub(/[[:space:]].*/,"")
print; exit
}' \
RS= \
<(networksetup -listallhardwareports)
)
if [[ "$wifiPort" = "$currentPort" ]]; then
echo "I'm on WiFi!"
else
echo "I'm NOT on WiFi!"
fi
当然,您也可以单独使用bash进行此操作,而无需使用awk:
#!/bin/bash
junk=$(route get default)
[[ $junk =~ .*interface:\ ([a-z]+[0-9]+) ]]
currentPort="${BASH_REMATCH[1]}"
while read line; do
if [[ $line = *Wi-Fi ]]; then
read line
wifiPort="${line##* }"
break
fi
done < <(networksetup -listallhardwareports)
if [[ "$wifiPort" = "$currentPort" ]]; then
echo "I'm on WiFi!"
else
echo "I'm NOT on WiFi!"
fi
请注意,while read line
循环并不是特别有效,bash 4 mapfile
/ readarray
的性能会更好。但是macOS中bash的默认版本仍然是3.:)