文本三剑客之awk

awk

工作原理:

逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方.

命令格式:

awk 选项 '模式或条件 {操作}' 文件 1 文件 2 …
awk -f 脚本文件 文件 1 文件 2 …
演示:

一.按文本输出

1.输出文件所有内容

awk '{print}' testfile2 				#输出所有内容
awk '{print $0}' testfile2 				#输出所有内容

2.输出第一道三行内容   中间是且 &&

awk 'NR==1,NR==3{print}' testfile2		#输出第 1~3 行内容
awk '(NR>=1)&&(NR<=3){print}' testfile2	#输出第 1~3 行内容

3. 输出第一行 第三行内容   中间是或  || 

awk 'NR==1||NR==3{print}' testfile2		#输出第1行、第3行内容

4.输出以root开头的行  在/etc/passwd 文件中   /^root/以root开头

awk '/^root/{print}' /etc/passwd		#输出以 root 开头的行

5. 输出以 nologin 结尾的行     $以什么结尾

awk '/nologin$/{print}' /etc/passwd		#输出以 nologin 结尾的行
二.按字段输出:

awk -F   -F指定分隔符

1.以冒号为分隔符  输出第三个字段

awk -F ":" '{print $3}' /etc/passwd	#输出每行中(以空格或制表位分隔)的第3个字段

2.以冒号为分隔符  输出第一个 第三个字段

awk -F ":" '{print $1,$3}' /etc/passwd		#输出每行中的第1、3个字段

3. 以冒号为分隔符 输出第3个字段的值小于5的第1、3个字段内容

awk -F ":" '$3<5{print $1,$3}' /etc/passwd	#输出第3个字段的值小于5的第1、3个字段内容

4  以冒号为分隔符  ,输出第7个字段不为/bin/bash,也不为/sbin/nologin的所有行

awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd	

5.输出第1个字段中包含root且有7个字段的行的第1、2个字段‘

awk -F ":" '($1~"root")&&(NF==7){print $1,$2}' /etc/passwd

案例演示:

统计a.txt下不同IP地址出现的次数

cat a.txt

    192.168.1.1
    192.168.2.2
    192.168.1.1
    192.168.3.3
    192.168.2.2
    192.168.1.1

命令:

awk '{IP[$1]++}END{for(i in IP){print i,IP[i]}}' a.txt

  过程解析:

    第一部分:IP[$1]++
    IP:定义的一个数组变量IP,数据变量IP的下标名取不同的IP地址(awk中下标名可以是字符串)
    [$1]:这里的$1是对a.txt的第一列进行取值。(之所以可以实现循环取值,是因为awk逐行读取的机制)
    ++:当a[0]=1时,a[0]++结果为2
    所以IP[$1]++过程如下:
        IP[192.168.1.1]  1
        IP[192.168.2.2]  1
        IP[192.168.1.1]  2
        IP[192.168.3.3]  1
        IP[192.168.2.2]  2
        IP[192.168.1.1]  3
 
    第二部分:{for(i in IP){print i,IP[i]}
    for(i in IP):这里i取值取的是数组变量IP的下标名,即:不同的ip地址
    {print i,IP[i]}:最后我们希望看到的是【ip地址】和【数量】,所以打印【i值】和【元素IP[i]】



 

 

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值