Linux 文本处理三剑客之awk

awk:三位创始人名字的缩写 文本报告生成器 (能够将给定文本以非
常美观的形式显示出来)
linux 上面默认使用 gawk
awk 的处理机制:
根据模式一次从文件中抽取出一行文本,对这行文本进行切片(默认使用空白字符当做分隔符)eg:this is a test
在这里插入图片描述

awk 处理机制:awk 会逐行处理文本,支持在处理第一行之前做一
些准备工作,以及在处理完最后一行做一些总结性质的工作,在命令
格式上分别体现如下:
BEGIN{}:读入第一行文本之前执行,一般用来初始化操作{}:逐行处理:逐行读入文本执行相应的处理,是最常见的编辑指令

END{}:处理完最后一行文本之后执行,一般用来输出处理结果

awk '{print $1}' file 打印第一列
awk '{print $1 ":" $2}' file 打印第一列:第二列
awk '{print $0}' file 打印全文
awk 'NR==1{print}' file 打印第一行
awk 'BEGIN{print "hello"}{print NR,NF,FILENAME}END{print "end"}' file 开始打印hello,打印行数、列数、文件名,结束打印end
awk的基本用法

awk 'BEGIN{a=34;print a+12}'
awk '{if(NR>=20 && NR<=30) print $1}'   /etc/passwd

实例:

[kiosk@asimov ~]$ awk 'BEGIN{a=34;print a+12}'
46

输出第三行的用户记录: awk -F: ‘NR==3{print}’

[kiosk@asimov ~]$ awk -F: 'NR==3{print}'  /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin

输出奇数(行号 NR 除以 2 余数为 1)行的用户记录:awk -F: ‘NR%2==1{print}’

[kiosk@asimov ~]$ awk -F: 'NR%2==1{print}'  /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

输出前三行文本: awk -F: 'NR<=3{print}'
输出偶数(行号除以 2 余数为 0)行的用户记录:awk -F: 'NR%2==0{print}'
输出从第五行开始到文件末尾的所有行: awk -F: 'NR<=5{print}'

输出用户名为‘sync’的行: awk -F: ‘$1==“sync”{print}’

awk –F:’$3>=0&&3<2{print $1,$3}’/etc/passwd (列出 UID 小于2 的用户信息)

awk –F ‘$3==1||$3==7{print $1,$3}’/etc/passwd (列出 UID 为1 或者 7 的用户信息)

awk ‘BEGIN{i=0}{i+=NF}END{print i}’ (统计文本的总字段个数)

[kiosk@asimov ~]$ awk 'BEGIN{i=0}{i+=NF}END{print i}' /etc/passwd
89

单分支:统计/etc/passwd 文件中 UID 小于或者等于 500 的用户个数“

awk -F: 'BEGIN{i=0}{if($3<=500){i++}}END{print i}' /etc/passwd

统计/etc/passwd 文件中 UID 大于 500 的用户个数:

awk -F: 'BEGIN{i=0}{if($3>500){i++}}END{print i}' /etc/passwd

统计/etc/passwd 文件中登陆 shell 是/bin/bash 的用户个数

awk -F: 'BEGIN{i=0}{if($7~/bash$/){i++}}END{print i}' /etc/passwd

统计/etc/passwd 文件中登陆 shell 不是/bin/bash 的用户个数

awk -F: 'BEGIN{i=0}{if($7!~/bash$/){i++}}END{print i}' /etc/passwd

分别统计/etc/passwd 文件中 UID 小于或等于 500,UID 大于 500 的用户个数:

awk-F:/etc/passwd'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{printi,j}'

分别统计/etc/passwd 文件中登陆 shell 是/bin/bash 登陆 shell 不是/bin/bash 的用户个数

awk-F:'BEGIN{i=0;j=0}{if($7~/bash$/){i++}else{j++}}END{printi,j}'/etc/passwd

双分支上课示例:
分别统计/etc/passwd 文件中登陆 shell 是 /bin/bash /sbin/nologin 和
其他的 用户个数:

awk-F:'BEGIN{i=0;j=0}{if($7~/bash$/){i++}else{j++}}END{printi,j}'/etc/passwd

While 循环示例:
统计/etc/passwd 文件内 root 出现的次数

awk -F [:\] \> 'BEGIN{j=0} \> {i=1}{while(i<=NF){if($i~/root/){j++};i++}} \> END{printj}'/etc/passwd

(示例分析:以:或者/做分隔,针对每一行的每一列进行比对,如
果包含 root 则次数加 1 其中:逐行处理直接由 awk 完成,逐列处理交
给 while 循环,通过 i 变量依次取$1, 2... 2... 2...NF 进行检查;变量 j 在预处
理时赋值 0,每匹配一个子段加 1)

awk ‘BEGIN{for(i=1;i<5;i++){print i}}’

[kiosk@asimov ~]$ awk 'BEGIN{for(i=1;i<5;i++){print i}}'
1
2
3
4

列出 100 以内整数中 7 的倍数或者是含 7 的数(用 awk 来实现 )
此操作无处理文件,正常思路应该是用 shell 循环来完成;因为要求用 awk 来实
现,如果不用循化,则根据逐行处理的思路,应该提供一个 100 行的文本对象,
然后将行号作为处理的整数,逐个判断并输出即可
利用 seq 命令可生成 1-100 的整数序列:seq 100
结合管道交给 awk 处理,那么根据可简化实现步骤。针对本题,行号与每行的
实际文本值是一致的 NR 或者$0 行值进行判断都是可以的:

seq 100 | awk 'NR%7==0||NR~/7/{print}'

seq 100 | awk '$0%7==0||$0~/7/{print}'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值