1、过滤出 IP 地址。
2、分析过程 一:
①、192.168.100.120, ip 地址的格式都是有规范,数字.数字.数字.数字。过滤时可参考这个格式模板。
②、根据 IP 数字后带 . 的规范,尝试过滤出数据格式。由于没有指定多少位的数字,所以现在的过滤条件 [[:digit:]]\ . 只是数字后带 . 的条件。
- ③、[[:digit:]]\ {3\ }\ . 指定过滤 3 为数字后带 . 的数据,根据输出看到范围进一步缩窄了。IP 中也有三段可以标红。剩下一段没有标红是因为它不符合数字后面带有 . 的条件。
-
④、假若在原来 [[:digit:]]\ {3\ }\ . 的条件后再加上 [[:digit:]]\ {3\ } 过滤 3 个数字的条件。原意想在第 ③ 点已经过滤了 IP 前三段,现在再把最后一段的 3 位数字过滤出来。情况会如何???
一眼看下去,每段的数字都已经标红,好像 OK 了。细心一看,实际上中间 IP 地址中间的有个白点,也就没有匹配到。(⊙o⊙)…
IP 地址中间的有个白点没有匹配到 通过 ifconfig eth0 | grep -o "[[:digit:]]\ {3\ }\ .[[:digit:]]\ {3\ }" 只显示匹配的部分,不难看出匹配出来的 IP 分成了几段,并不是设想的匹配余下第 4 段的数字内容。
分析 "[[:digit:]]\ {3\ }\ .[[:digit:]]\ {3\ }" 表达式。
[[:digit:]]\ {3\ }\ .:过滤 3 位数字后面带 . 的数据。
[[:digit:]]\ {3\ }:过滤 3 为数字。
[[:digit:]]\ {3\ }\ .[[:digit:]]\ {3\ }:整条表达式是过滤 . 前后都有 3 位数字的数据。
所以得出了上图 IP 分段的结果。
- ⑤、这样的话就根据 IP 的格式(??? . ??? . ??? . ???),分别写清楚每段的表达式,约束每段的显示内容。已知 [[:digit:]]\ {3\ }\ . 过滤 3 位数字后面带 . 的数据,[[:digit:]]\ {3\ }:过滤 3 为数字。那么,前面 3 段可以是 [[:digit:]]\ {3\ }\ .,第 4 段是 [[:digit:]]\ {3\ }。整段应该是 [[:digit:]]\ {3\ }\ . [[:digit:]]\ {3\ }\ . [[:digit:]]\ {3\ }\ . [[:digit:]]\ {3\ }。
- grep 加上 -o 参数只显示过滤出来的内容。然后,通过 head -n1 只显示第 1 行数据,得出想要的 IP 地址。
- ⑥、调整:实际上 [[:digit:]]\ {3\ }\ . [[:digit:]]\ {3\ }\ . [[:digit:]]\ {3\ }\ . [[:digit:]]\ {3\ } 这个表达式写死了只显示 3 位的数字。少于 3 位数无法显示,实际 IP 会有少于3 位数的情况。所以需要调整一下。
分析:IP 每段最少是 1 位数字,最多是 3 位数字。如:最少 1.1.1.1,最多 111.111.111.111 。所以,约束数字位数的时候可以写成 \ {1,3\ },可以过滤 1 位 到 3 位的数字。
测试:[[:digit:]]\ {1,3\ } 看看能不能正常过滤 1 到 3 位数字,3 位以上是否不能过滤。
- 优化:从测试中可以得出 [[:digit:]]\ {1,3\ } 的效果可以过滤 1 到 3位的数字。可以优化过滤 IP 的需求。
3、分析过程 二:
①、通过观察 IP(192.168.0.224) 的组成是数字和符号 . (点)。过滤的元素只需考虑数字和 . 就可以。而 IP 最少的表达形式是 1.1.1.1(数字连同 . (点)最少7 位)。所以,表达式可以写成 [[:digit:].]\ {7,\ },过略 7 位以上任意数字和符号 . (点)。
②、其中,[[:digit:].] 外层的 [ ] 中括号作用是匹配指定范围内的任意单个字符。外层的 [ ] 中括号包裹的 [:digit:]. 表示任意数字和 . 的数据。
[[:digit:].] 整句表示过滤任意数字 和 . 的数据。如下图:ifconfig eth0 文件下所有的数字和 . 都会标红。其中包括我们想要提取的 IP 地址。
- ③、第②点由于没有指定字符长度,所以过滤了所有的数字和 . 的数据出来。根据 IP 最少的表达形式是 1.1.1.1(数字连同 . (点)最少7 位)。表达式可以写成 [[:digit:].]\ {7,},指定过滤7位字符以上任意数字和符号 . 的数据。
- ④、grep -o 只显示过滤的数据。
- ⑤、head -1 提取第一行数据,完成提取想要的 IP 地址。
4、分析过程 三:
- ①、ifconfig eth0 里面的 IP 地址前面有个 inet 英文。可以通过这个特征去考虑过滤后面的 IP。
- ②、以 inet 空格开头为过滤特征,后面跟数字,符号. (点)。如下图, inet 空格开头,匹配后面数字和符号 . (点)任意单一字符就会看到效果,inet 空格后的数字 1 标红。
- ③、接下来 [[:digit:].] 后面加上 \+,+ 是匹配前面的字符至少有 1 次,( \ 是转义字符 )。那么,[[:digit:].] 数字和符号 . (点)作为条件去匹配 inet 空格后面的内容。当 inet 空格后面只要有数字或者字符 . (点)时,就会标红。IP 的格式是连续的数字和符号. 所组成,中间并没有其他字符,直到匹配完第 4 段数字后的空格,因为空格不是数字,也不是符号 . (点),所以匹配区域到此为止。完成空格前数字和符号 . (点)的内容匹配。最后,以 inet 开头的整个 IP 就能过滤出来。
- ④、grep 加上 -o 列出过滤的内容。
- ⑤、用 cut 命令根据空格为分隔符截取第 2 字段的内容,也就截取 IP 打印出来。