上一堂课,编写用于诊断的 bash 脚本。
我完全陷入困境的是如何仅捕获该行中的特定行和文本段。
IE:如果我执行 ifconfig
[user@localhost ~]$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.88.140 netmask 255.255.255.0 broadcast 192.168.88.255
inet6 fe80::fbaa:d42c:24db:dca7 prefixlen 64 scopeid 0x20
ether 00:0c:29:bc:c1:4d txqueuelen 1000 (Ethernet)
我希望 bash 将 ipv4 地址的第 2 行第 12 至 27 列捕获到 $string 中,并继续对网络掩码、广播、mac 地址和 ipv6 地址/cidr 执行相同操作...
也执行相同操作以获取任何名称服务器在resolve.conf 文件中。
然后我当然必须对每个接口重复此操作......
除非有人能推荐更好的方法来做到这一点。
我还想知道是否有办法可以将 $string 插入 ifcfg-ens33 文件来更改 IP 地址(以及其他所有内容),或者我最好完全重新创建该文件吗?
我认为有了这些信息我应该能够很容易地完成剩下的练习
编辑:我可以看到我需要对字段做一些事情,但我可以弄清楚如何让它只将第 2 行的字段 2 插入 $ipv41
EDIT2:我在阅读更多内容后想出了这个。但到目前为止我无法将输出放入变量中。尝试了 echo、printf、>、>>、>>>
#import settings from ip command
#discover interface type into string
/sbin/ip -o -4 addr show up primary scope global| awk '{print $2}' | echo >
$if1
#discover interface ipaddress by interface type into strings
/sbin/ip -o -4 addr show $if1 | awk '{print $4}' | echo > $ipv4
/sbin/ip -o -4 addr show $if1 | awk '{print $6}' | echo > $bast
/sbin/ip -o -4 addr show $if1 | awk '{print $9}' | echo > $dhcp
/sbin/ip -o -6 addr show $if1 | awk '{print $4}' | echo > $ipv6
#print discovered info to screen
echo -e "---- Interface = $if1"
echo -e "---- DHCP Enabled? $dhcp"
echo -e "---- IPv4 Address = $ipv4"
echo -e "---- Broadcast = $bast"
答案1
嗯,总是有head
,tail
和cut
,但这可能更容易:
echo `ifconfig wlo1` |
{ read a b c d e inet f netmask g broadcast h inet6 i ; echo $inet $inet6 ; }
输出:
192.168.1.120 fe80::b400:3b2e:a40a:9f19
笔记:
read
一次性命名并设置变量。这a b c d e
ETC。是用于吸收不需要的ifconfig
输出的虚拟变量。一旦
}
运行,变量就不再存在。因此,放置使用这些变量的任何代码前这}
。
答案2
尝试这个:
ifconfig -a | tr -s ' ' | awk -F ' ' '{if (/^[a-z]/) printf $1 " "} {if (/inet /) print " " $3" "$5" "$7} {if (/ether/) print " " $2"}'