Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在bash脚本中获取子字符串_Linux_Bash_Parsing - Fatal编程技术网

Linux 在bash脚本中获取子字符串

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

我试图在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
      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参数部分:(