这是.sh 脚本文件的内部:
cd /somefolder
IP=$(ifconfig | grep 'inet addr:'| grep 168 | grep 192|cut -d: -f2 | awk '{print $1}')
/somefolder 有另一个文件夹列表,其中包含一个文本文件。
有人可以解释一下上述命令的作用吗,它将 bash 与 grep 和 awk 结合起来。
另外,为了调试它并更好地理解它,我是否也可以在命令行中运行它?
答案1
ifconfig
给你留下如下一段文字:
eth0 Link encap:Ethernet HWaddr aa:aa:aa:aa:aa:aa
inet addr:192.168.0.4 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::6ef0:49ff:fe54:b80/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:118583044 errors:0 dropped:0 overruns:0 frame:0
TX packets:117593447 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:86729976752 (86.7 GB) TX bytes:96008613785 (96.0 GB)
第一个grep
过滤器会过滤包含的行inet addr:
,剩下:
inet addr:192.168.0.4 Bcast:192.168.0.255 Mask:255.255.255.0
接下来的两个grep
命令再次进行过滤,查找192
和168
。我认为它正在搜索本地 IP。看起来像 的 IP 192.168.*.*
。并非所有本地 IP 都看起来像那样,但我现在先忽略它。
在我们的示例中,没有其他内容被过滤掉。
然后切割:
用作分隔符(切割点)并取第二个值:
192.168.0.4 Bcast
awk
默认以空格分隔并打印第一列,剩下:
192.168.0.4
这是一个尝试获取本地 IP 的脚本。它不太好用。如果您的 LAN 使用不同的寻址格式,或者您有一个合法的(外部)IP,其中包含 192 或 168 或其掩码 — 如 4.4.168.192 — 这会错误地捕获它。
可能有比过滤ifconfig
输出更好的方法来获取你的内部 IP,但这里是另一种只使用一个 awk 来清理的过滤方法:
ifconfig | awk -F' |:' '/inet addr:192\.168\./ {print $13}'
它只适用于 192.168。。地址,但这已经比现有的命令更好了。