awk -F选项同时指定多个符号做为分割符时遇到空格坑,题目:请执行命令取出 linux 中 eth0 的 IP 地址

第三关课前考试题:3.请执行命令取出 linux 中 eth0 的 IP 地址(请用 cut,有能力者也可分别用 awk,sed 命令答)

因为以前有个题讲过awk -F选项可以指定输入分割符,也可以同时使用多个符号作为分割符对文件进行切割,所以我决定先使用awk -F

以前awk -F同时指定多个分割符的例子:

[[email protected] ~]# cat oldboy.txt
I am oldboy,myqq is 31333741
[[email protected] ~]# awk -F "[ ,]" ‘{print $3,$6}‘ oldboy.txt 
oldboy 31333741

然后开始做题:请执行命令取出 linux 中 eth0 的 IP 地址

[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $1}‘

[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $2}‘

[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $3}‘

[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $4}‘

一直打印到第四列,都没有任何东西输出到屏幕上,然后我的头顶开始冒出一堆的问号。。。这是什么情况?不按套路跟我玩啊?

那好吧,用$0打印全部列试试

[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $0}‘
          inet addr:192.168.56.130  Bcast:192.168.56.255  Mask:255.255.255.0

没问题!

奇怪!

我仔细观察了一下这行文档,发现inet addr:192.168.56.130和Bcast:192.168.56.255和Mask:255.255.255.0之间是有两个空格,我猜有可能是因为这个原因(最后证明这并不是根本原因),导致用一个空格做为分割符有可能不行?这时候想到有个+号可以使用连续多个相同的符号做为分割符,试试!

[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘:|[ ]+‘ ‘{print $4}‘
192.168.56.130

哈!成功了!

但是之前的命令 [[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $4}‘ 没有任何错误提示,说明应该是正确的,但是为什么没有任何输出呢?

打印一下最后一列和倒数的几列试试

[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $NF}‘
255.255.255.0
[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $(NF-1)}‘
Mask
[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $(NF-2)}‘

[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $(NF-3)}‘
192.168.56.255

没问题,说明这个命令是正确的

最后我又打印了一下整列仔细观察了一下:

[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $0}‘
          inet addr:192.168.56.130  Bcast:192.168.56.255  Mask:255.255.255.0

咦?这一行字符的最前面好象有一些空格!难道每一个空格都被分割为一列了吗???

WTF!我竟然被一堆小小的不起眼的空格给坑了!赶紧再试一下

[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $13}‘
192.168.56.130

终于出现了。。。

至此,问题终于清晰,最初的方法并没有错,问题在于这一行字符最开始有十个空格,会占用十列,所以导致打印前十列的时候,只输出一个空的内容,而像我这样刚入门的小白,很容易就会以为出错了。

关于此题的其他解法,等有时间了我会陆续进行补充。其他解法的大体思路基本都差不多,现在能想到至少有四、五种解法,但其实都是换汤不换药,只要掌握了核心思想,会一种解法,稍微变通一下,就又成了另一种解法。

时间: 2024-10-29 19:10:20

awk -F选项同时指定多个符号做为分割符时遇到空格坑,题目:请执行命令取出 linux 中 eth0 的 IP 地址的相关文章

awk之FS的指定

awk之FS的指定 file: FAN1 | 11h | ok | 160.96 | 11139 RPM FAN2 | 12h | ok | 160.96 | RPM FAN3 | 13h | ok | 160.96 | 10763 RPM FAN4 | 14h | ok | 160.96 | 10998 RPM FAN5 | 15h | ok | 160.96 | 11515 RPM [code] awk -F '[ ]' '{print $9}' file awk -F '[ ]' '($9

linux中的文件处理grep、sed、awk

1.grep grep [options] pattern [file-]options:表示选项pattern:要匹配的模式.file:表示一系列的文件名选项:-c 只输出匹配行的计数-i 不区分大小写(用于单字符)-n 显示匹配的行号-v 不显示不包含匹配文本的所以有行-s 不显示错误信息-E 使用扩展正则表达式 grep -c 关键字 文件名 ##显示出现的关键字的行数grep -n 关键字 文件名 ##显示该关键字的行grep -n2 关键字 文件名 ##显示该关键字行的上下各两行gre

多IP指定出口IP地址 如何指定云服务器源IP?

如果一个主机绑定有多个IP地址,那么在被动响应和主动发起连接两种方式中,源IP地址的选择机制肯定是有所差异的.主机在接收外部数据包,并发送响应数据包时,响应源地址显然就是客户端请求的地址,这是非常容易理解的,如客户端向主机的1.1.2.3:80发起请求,那么主机响应数据包的源IP地址一定是1.1.2.3. 那么当主机对外主动发起请求时,数据包的源IP地址如何选择?这个问题我们可能一般很少深入了解, 为了弄清楚这个问题,我发了不少时间,广泛查阅各种资料,目前得出的结论如下: Linux 2.2 选

awk常用选项举例

1.awk 的语法 awk [选项] ' print $1' 文件名 选项 -F  指定分隔符 比如: awk -F: '{ print $1 }' /etc/passwd $NF  最后一列 NR  行数       //注意没有$ 2.awk举例 1.提取出/etc/passwd 文件当中,UID小于1000的用户名信息和UID信息 [[email protected] ~]# awk -F : ' $3<1000  {print $1,$3}' /etc/passwd 2.提取出/etc/

win7 64下VS2010编译的时候出现fatal error LNK1146: 没有用选项“/out:”指定的参数终极解决方案

win7 64 下创建mfc后直接编译运行报错:fatal error LNK1146: 没有用选项"/out:"指定的参数. 按照 VS2010编译的时候出现fatal error LNK1146: 没有用选项"/out:"指定的参数 上说的方案也没有成功. 最后解决办法是将X:\Program Files\Microsoft Visual Studio 10.0\VC\bin目录下 拷贝cl.exe.替换C:\Windows\system目录下的cl.exe文件

【Linux】命令写在文件中并调用awk -f

我们在使用awk命令的时候,有时候命令特别长,在终端写出来格式太乱,难以阅读,以下是一个将命令写在文件中,并使用awk调用的具体案例 1.现在有文件file3.txt,内容如下: 2.ak2.awk脚本 #打印标题并格式化打印出数量合计 BEGIN { FS="\t" #设置字段分割符 printf("%10s %2s %5s %s\n\n", "Fruits","Num","Price","Pl

Linux tar命令exclude选项排除指定文件或目录

在linux中可以用tar打包目录以方便传输or备份,我们先来看一个例子 test 文件夹有如下文件 1 [[email protected] ~]# ll test 2 总用量 8 3 -rw-r--r--. 1 root root 0 4月 14 22:18 a.jpg 4 -rw-r--r--. 1 root root 0 4月 14 22:25 a.log 5 -rw-r--r--. 1 root root 0 4月 14 22:18 a.txt 6 -rw-r--r--. 1 root

Linux下tar命令exclude选项排除指定文件或目录

在linux中可以用tar打包目录以方便传输or备份,我们先来看一个例子 test 文件夹有如下文件 1 2 3 4 5 6 7 8 9 10 [[email protected] ~]# ll test 总用量 8 -rw-r--r--. 1 root root    0 4月  14 22:18 a.jpg -rw-r--r--. 1 root root    0 4月  14 22:25 a.log -rw-r--r--. 1 root root    0 4月  14 22:18 a.t

Linux中特殊符号的用法

在shell中常用的特殊符号罗列如下: # ;   ;; . , / \\ 'string'| !   $   ${}   $? $$   $* \"string\"* **   ? : ^ $#   [email protected] `command`{}   [] [[]] ()   (()) ||   && {xx,yy,zz,...}~   ~+   ~-   &   \\<...\\>   + - %=   ==   != #井号 (co