Linux 在bash脚本中获取子字符串
我试图在bash脚本中获得一个子字符串,但是我这样做并不是一个好的解决方案。我正在分析“ifconfig”命令的响应,并尝试获取第一个网络接口名 ifconfig的结果:Linux 在bash脚本中获取子字符串,linux,bash,parsing,Linux,Bash,Parsing,我试图在bash脚本中获得一个子字符串,但是我这样做并不是一个好的解决方案。我正在分析“ifconfig”命令的响应,并尝试获取第一个网络接口名 ifconfig的结果: eth0 Link encap:Ethernet HWaddr b8:27:eb:6d:a1:92 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0
eth0 Link encap:Ethernet HWaddr b8:27:eb:6d:a1:92
UP BROADCAST 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)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:73 errors:0 dropped:0 overruns:0 frame:0
TX packets:73 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:7099 (6.9 KiB) TX bytes:7099 (6.9 KiB)
wlan0 Link encap:UNSPEC HWaddr ****
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:792698 errors:0 dropped:792552 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:219274179 (209.1 MiB) TX bytes:0 (0.0 B)
wlan5 Link encap:Ethernet HWaddr ****
inet addr:**** Bcast:**** Mask:****
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:48934 errors:0 dropped:3422 overruns:0 frame:0
TX packets:21217 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14458518 (13.7 MiB) TX bytes:2692948 (2.5 MiB)
正在获取第一个接口名,即wlan0
conf=`ifconfig`
net=${conf:670:6}
我不明白,但位置有时会改变,这就是为什么我不能使用索引670。Wlan0可以是wlan1、wlan2等等。。。我无法专门搜索wlan0。有什么建议吗?起初,我认为问题是获取所有无线局域网,并回答了以下问题:
$ ifconfig | egrep -A6 '^wlan[0-9]:'
但后来有人指出这是GNU,不是BSD,所以我应该说
$ ifconfig | egrep -A6 '^wlan[0-9]'
(无冒号)。然后澄清说,只需要第一个,所以也许
$ ifconfig | head -n 6
有更好的答案吗
如果在任何描述中没有精确的6行,那么这不是一个很好的答案
另一种方法是:
$ ifconfig eth0 || ifconfig lo0 || ifconfig wlan0 || ifconfig wlan1
等等。|
表示如果第一部分失败,请尝试第二部分。你会收到错误消息,直到你找到一个有效的
现在有更好的
$ ifconfig | head -n 1
我会给你第一个。拿着那条线,剪下线上的第一件东西,然后把它传递给ifconfig
。这应该可以在Linux上运行:
$ ifconfig | head -n 1 | awk '{print $1}' | xargs ifconfig
像这样的怎么样
ifconfig | grep -v "^ " "eth0" "lo" | head -1 | cut -c1-6
不过,我没有一台Linux pc来测试它
基本上,我只提取所有具有网络接口名称的行,删除所有eth0和lo内容,然后得到第一行,只得到我需要的字符
ifconfig | awk -vRS= '!/^(eth0|lo)/{print $1;exit}'
跳过etho和lo块并打印下一个字段的第一个字段,然后退出。问题说Wlan0可以是wlan1、wlan2等等……它可以超过9吗?如果是这样,请调整我的答案,在
[0-9]
之后添加一个加号。谢谢,但我有多个网络接口,所以我只需要获取第一个,可能是wlan0、wlan1、wlan2等。在这种情况下,它不会打印任何内容。哦,我将删除冒号;我在这里的BSD机器上看到了他们。我将编辑答案。好的,我刚刚找到一个适合你的表达式。使用xargs
和awk
有点疯狂。这是长答案的结尾。您可能可以将其简化一点,但希望这是一个开始。您可以指定ifconfig的接口:ifconfig wlan0
。它需要是第一个网络接口名(如您在问题开始时所说)还是必须是wlan,如问题结尾所示?第一个接口名,在本例中,它是wlan0,但它可以更改ifconfig | grep'^wlan'| head-1 | cut-d'-f1
?@tivn这就是我要找的。非常感谢。我有一个问题,“cut-d”'-f1“用于什么?我得到了这个错误;awk:第1行:^@AhmetTanakol处或附近的语法错误我在发布后几秒钟编辑了答案,您是否使用了原始答案?再试一次。这也行。它类似于tivn的解决方案。他直接获得wlan,在您的情况下,您首先消除eth0和lo,然后获得下一个字符串输出;grep:eth0:没有这样的文件或目录grep:lo:没有这样的文件或目录是的,这将给出一个错误,因为只有grep的第一个参数是要搜索的模式,所有后续的参数都是要搜索的文件名。grep部分应该是:egrep-v'^(| eth | lo)
。Yep@JID和tivn,你完全正确。我无法测试它,忽略了grep参数部分:(