Linux 文本处理三剑客 (3)

这里的NR还是表示行号,$0 表示一整行的内容(一行的内容)。

3.5 显示第 2 行到 第 6 行,并打印行号 awk \'NR==2,NR==6 {print NR,$0}\' test.txt 3.6 显示文件的第 1 列、第 3 列和最后一列 awk -F ":" \'{print $1,$3,$NF}\' test.txt 这里我们使用了 awk 的 -F参数。-F表示指定一个`分隔符`来切割每一行的内容,-F后面可用单双引号或不加引号,但是,建议加双引号。 `$1`表示根据分隔符分割的第一列,`$2`表示根据分隔符分割的第二列,以此类推。 `$0`表示整行。`$NF`表示最后一列。 3.7 把文件中的 /sbin/nologin 替换为 /bin/bash awk \'{gsub("/sbin/nologin","/bin/bash",$0);print $0}\' test.txt 3.8 生产案例1:取出 eh0 网卡对应的ip地址 ifconfig eth0 >>> eho Link encap:Ethernet Hwaddr 00:0C:29:93:49:99 inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0 ...

​ 取出的方式

ifconfig eth0|awk -F "(addr:)|( Bcast:)" \'NR==2{print $2}\' >>> 10.0.0.8

​ 我们的目标是取得ip,本例是10.0.0.8,ip的左边是 addr:,右边是 Bcast:。所以两边都是分隔符,就可以取到我们想要取到的值。(这里需要注意-F 指定多分割符的写法)

​ 还有一个简单的方法

ifconfig eth0|awk -F "[ :]+" \'NR==2{print $4}\'

​ 结合起来,-F "[ :]+"就是以单个或连续的空格或冒号或者它们的组合为分隔符。最后就可以获得我们想要的ip地址。

3.9 面试题--统计域名访问次数

测试数据如下:

http://www.etiantian.org/1.html http://mp3.etiantian.org/index.html http://post.etiantian.org/2.html 3.9.1 方案1

(1)取出每行中的域名

awk -F \'/\' \'{print $3}\' test.txt >>> www.etiantian.org post.etiantian.org mp3.etiantian.org post.etiantian.org

(2)排序(让相同的域名相邻)

awk -F \'/\' \'{print $3}\' test.txt|sort

(3)去重计数

awk -F \'/\' \'{print $3}\' test.txt|sort|uniq -c 3.9.2 方案2(awk数组方案)

(1)取出域名

awk -F \'/\' \'{print $3}\' test.txt

(2)创建一个 awk 数组,然后把第二列(域名)作为数组的下标,再通过类似于 i++ 的形式来计算域名重复的次数

awk -F \'/\' \'{hotel[$3]}\' test.txt # 创建 awk 的hotel 数组 awk -F \'/\' \'{hotel[$3];print $3}\' test.txt #创建 awk 的hotel 数组,并通过 print 输出元素名字(房间号码),注意,这里没输出数组,所以看到的还是第一阶段的内容 >>> awk -F \'/\' \'{print $3}\' test.txt

(3)开始统计

awk -F \'/\' \'{hotel[$3]++;print $3,hotel[$3]}\' test.txt >>> 1 2 post.etiantian.org 1 mp3.etiantian.org 1 3 post.etiantian.org 2

(4)输出最终结果

上面的命令详细地显示了 awk 统计的过程。如果想要获得最终结果该怎么办呢?通过END模式来输出最终结果。

awk -F \'/\' \'{array[$3]++}END{ print "www.etiantain.org",array["www.etiantian.org"]; print "post.etiantian.org",array["post.etiantian.org"]; print "mp3.etiantian.org",array["mp3.etiantian.org"]; }\' test.txt

awk数组提供了自己独有的方法来完成它——一个专用的循环:

awk -F \'/\' \'{hotel[$3]++}END{for(domain in hotel)print damain,hotel[domain]}\' test.txt >>> mp3.etiantian.org 1 post.etiantian.org 2 3

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzspf.html