首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash脚本中获取子字符串

问在bash脚本中获取子字符串
EN

Stack Overflow用户
提问于 2015-05-05 06:55:25
回答 3查看 132关注 0票数 0

我试图在bash脚本中获得一个子字符串,但是这样做并不是一个好的解决方案。我正在解析"ifconfig“命令的响应,并试图获得第一个网络接口名称。

ifconfig:结果:

代码语言:javascript
复制
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

代码语言:javascript
复制
conf=`ifconfig`

net=${conf:670:6}

我不明白,但位置有时会改变,这就是我不能使用索引670的原因。Wlan0可以是wlan1,wlan2等等.我不能专门搜索wlan0。有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-05 07:22:51

GNU awk

代码语言:javascript
复制
ifconfig | awk -vRS= '!/^(eth0|lo)/{print $1;exit}'

跳过etho和lo块,打印下一个字段的第一个字段,然后退出。

票数 1
EN

Stack Overflow用户

发布于 2015-05-05 06:58:59

起初,我认为问题是要得到所有的无线局域网,并回答如下:

代码语言:javascript
复制
 $ ifconfig | egrep -A6 '^wlan[0-9]:'

但后来有人指出这是GNU,而不是BSD,所以我应该说

代码语言:javascript
复制
 $ ifconfig | egrep -A6 '^wlan[0-9]'

(无结肠)。然后澄清说只需要第一个,所以也许

代码语言:javascript
复制
$ ifconfig | head -n 6

是更好的答案吗?

如果在任何描述中没有确切的6行,那么这不是一个很好的答案。

另一种办法是:

代码语言:javascript
复制
$ ifconfig eth0 || ifconfig lo0 || ifconfig wlan0 || ifconfig wlan1

诸若此类。||意味着如果第一部分失败,尝试第二个部分。你会得到错误信息,直到你找到一个有效的。

现在有更好的东西了!

代码语言:javascript
复制
$ ifconfig | head -n 1

会给你第一个。取这条线,去掉线上的第一件东西,然后把它传递给ifconfig。这应该适用于Linux:

代码语言:javascript
复制
$ ifconfig | head -n 1 | awk '{print $1}' | xargs ifconfig
票数 1
EN

Stack Overflow用户

发布于 2015-05-05 07:10:05

像这样的东西呢?

代码语言:javascript
复制
ifconfig | grep -v "^ " "eth0" "lo" | head -1 | cut -c1-6

但是没有一个Linux pc来测试它。

基本上,我只提取所有具有网络接口名称的行,删除所有的eth0和lo内容,然后得到第一个,只得到我需要的字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30046107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档