awk命令

1 awk命令

1.1 awk作用

擅长取列,擅长统计分析 实际上是gawk的软链接。模式扫描(条件分配),程序语言

1.2 语法

awk [参数] '模式(条件) {动作}(指令)' 文件信息

1.3 功能

查询,排除,替换
以下命令所需环境: cat > oldboy.txt <<EOF
Zhang Dandan 41117397 :250: 100 :175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250: 100 :175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250: 100 :175
EOF
1、显示Xiaoyu的姓氏和ID号码
(1)awk '/Xiaoyu/{print $1,$3}' oldboy.txt
1562288684558-6433e24a-3ccd-4ce4-9a22-51cd03319a49.png#align=left&display=inline&height=38&originHeight=38&originWidth=422&size=0&status=done&width=422
(2)awk '/Xiaoyu/{print $1" "$3}' oldboy.txt
1562288684112-81471949-1f8d-4b0c-bee7-71cdb5e652b8.png#align=left&display=inline&height=36&originHeight=36&originWidth=441&size=0&status=done&width=441
要用逗号,或者双引号分隔
按照指定列进行搜索信息
(1)awk '$2~/Xiaoyu/' oldboy.txt 将有Xiaoyu的信息显示出来
1562288684178-c3632d17-d977-464e-9bc6-8c4de55aee61.png#align=left&display=inline&height=36&originHeight=36&originWidth=353&size=0&status=done&width=353
(2)awk '$2!~/Xiaoyu/' oldboy.txt !:表示取反 排除Xiaoyu的信息,将其他信息取出来
~:代表在awk中列的匹配方式
1562288684302-42b915b7-d35b-49a8-b028-97e45c65a25f.png#align=left&display=inline&height=140&originHeight=140&originWidth=365&size=0&status=done&width=365
2、姓氏是zhang的人,显示他的第二次捐款金额及他的名字
第一步:先找出姓氏是张的人
awk '$1~/Zhang/' oldboy.txt
1562288684160-9fc8922b-cf7d-4093-bbda-27c5534c4085.png#align=left&display=inline&height=51&originHeight=51&originWidth=356&size=0&status=done&width=356
第二步:显示出名字和所有捐款记录
awk '$1~/Zhang/{print$2,$4}' oldboy.txt
1562288684126-d4265365-d765-48bb-ae29-68bd59f86cda.png#align=left&display=inline&height=52&originHeight=52&originWidth=425&size=0&status=done&width=425
第三步:指定字符信息作为空格符
awk -F "[: ]+" '$1~/Zhang/{print$2,$5}' oldboy.txt
1562288684146-7f4022ea-436c-4d1f-a155-2393c0c42c76.png#align=left&display=inline&height=50&originHeight=50&originWidth=510&size=0&status=done&width=510
补充:awk默认使用空格进行作为列分隔符 默认区分大小写
-F 指定分隔符的符号信息
利用 -F "[: ]+" -F 指定括号里的冒号,空格作为分隔符 +:将多个连续的分隔符汇总为一个整体
3、显示所有以41开头的ID号码人的全名和ID号码
第一步:找出ID号码是41开头的人
awk '$3~/^41/' oldboy.txt
1562288684415-f426d78d-2693-4282-8e3d-96bae8ea15c5.png#align=left&display=inline&height=51&originHeight=51&originWidth=333&size=0&status=done&width=333
第二步:显示出人的全名和ID号码
awk '$3~/^41/{print$1,$2,$3}' oldboy.txt|column -t
1562288684607-d9452aed-b04c-4a40-8ea5-b9466b82fcfd.png#align=left&display=inline&height=47&originHeight=47&originWidth=506&size=0&status=done&width=506
columt -t :对文件内容信息进行排序
4、显示所有ID号码最后一位数字是1或5的人的全名
第一步:找出ID号码最后一位数字是1或5的信息
awk '$3~/[15]$/'oldboy.txt
awk '$3~/1$|5$/' oldboy.txt
[ ]、| :在这里都是或者的关系
1562288684138-3ca6c029-cba5-4941-b4e5-f2ec19237056.png#align=left&display=inline&height=189&originHeight=189&originWidth=350&size=0&status=done&width=350
第二步:显示出全名信息
awk '$3~/[15]$/{print$1,$2}' oldboy.txt|column -t
1562288684141-e0b8938a-8791-464d-8367-7909ac71e72f.png#align=left&display=inline&height=92&originHeight=92&originWidth=502&size=0&status=done&width=502
5、显示文件中第二行,第三行的信息
第一步:显示第二行
awk 'NR==2' oldboy.txt
1562288684264-26bd93b6-d9a0-45f1-8c49-0ef692e66599.png#align=left&display=inline&height=36&originHeight=36&originWidth=315&size=0&status=done&width=315
第二步:显示第三列
awk 'NR==2{print $3}' oldboy.txt
1562288684210-2664895a-a231-426f-a24d-b5ddcb8bb6bb.png#align=left&display=inline&height=36&originHeight=36&originWidth=393&size=0&status=done&width=393
NR:表示行号信息,取出第几行信息
NR==2:取出第二行信息
6、显示Xiaoyu的捐款,每个捐款数值都有以$开头,
方法一:awk -F "[:]" 'NR==2{print "$"$2"$"$3"$"$4}' oldboy.txt
1562288684157-01a88825-72f6-4cdd-88ee-cf03cff2e4bf.png#align=left&display=inline&height=36&originHeight=36&originWidth=537&size=0&status=done&width=537
方法二:awk '$2~/Xiaoyu/{print $4}' oldboy.txt|sed 's#:#$#g'
1562288684178-87e070b1-9b70-4d84-b795-4cd7d872e4ca.png#align=left&display=inline&height=35&originHeight=35&originWidth=532&size=0&status=done&width=532
方法三:awk '$2~/Xiaoyu/{print $4}' oldboy.txt|tr ":" "$"
1562288684174-823d26df-e04f-44a2-ad33-71a3d020ecca.png#align=left&display=inline&height=32&originHeight=32&originWidth=508&size=0&status=done&width=508
方法四:awk替换功能
gsub(/要替换的信息/,"替换成什么",将第几列进行替换)
awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' oldboy.txt
1562288684177-9a4046af-69fd-4384-bbcb-4455009f4413.png#align=left&display=inline&height=36&originHeight=36&originWidth=563&size=0&status=done&width=563

1.4 awk命令高级功能说明

普通模式:
1、正则表达式作为模式 ^:还可以表示某一列的开始 $:还可以表示某一列的开始
2、比较表达式作为模式
awk 'NR==1{print $NF}' oldboy.txt
1562288684744-b0f358e6-e0a7-4469-8c8b-15ac50000312.png#align=left&display=inline&height=34&originHeight=34&originWidth=397&size=0&status=done&width=397
3、范围模式:
awk 'NR==1;NR==2' oldboy.txt 只查看第一和第二行
1562288684232-add94865-64af-42b4-96cc-e65891b7ef0b.png#align=left&display=inline&height=52&originHeight=52&originWidth=356&size=0&status=done&width=356
awk 'NR==1,NR==3' oldboy.txt 查看第一到第三行
1562288684376-debd7cca-6561-4b08-9e38-7fbba1012730.png#align=left&display=inline&height=62&originHeight=62&originWidth=365&size=0&status=done&width=365
特殊模式:BEGIN :在处理文件之前先执行的动作
(1)生成文件内容表头信息
awk 'BEGIN{print "姓氏","名称","id号码","捐款记录"}{print $0}' oldboy.txt |column -t
1562288684502-81b3d5a4-733d-40a5-ad82-22c8d19ee991.png#align=left&display=inline&height=144&originHeight=174&originWidth=750&size=0&status=done&width=620
(2)用于在系统中进行运算数值
awk 'BEGIN{print 2+3}'
1562288685127-ebec276d-3f4c-4ac7-b369-df6ee72a95db.png#align=left&display=inline&height=138&originHeight=138&originWidth=325&size=0&status=done&width=325
(3)修改或设置变量信息
a:awk命令中,会直接将字符串信息当成变量
$1: 表示取第一列
$NF:表示取最后一列信息
$: 表示取一行中所有的列
①awk 'BEGIN{oldboy=62;print oldboy}'
1562288684225-913279e8-0665-491d-ae5a-eda62acfa0ff.png#align=left&display=inline&height=34&originHeight=34&originWidth=404&size=0&status=done&width=404
将oldboy当成变量
②awk 'BEGIN{oldboy=62;print "oldboy"}'
1562288684226-0d90f19e-c019-4eb9-8342-dd1f3bf1f899.png#align=left&display=inline&height=34&originHeight=34&originWidth=423&size=0&status=done&width=423
加上" "取消oldboy的变量
b:awk命令中,变量分类:
自定义变量:oldboy=62
内置变量:
NF : 显示最后一列信息 $(NF-1) 取倒数第2列
NR : 表示行号信息0,取出第几行 NR==2 NR>=2 NR<=2
FS : 指定分隔符信息 -F
①awk -F ":" 'NR==1{print $2}' oldboy.txt
1562288684255-42cda392-1e76-4c1c-9080-873d8aa2a920.png#align=left&display=inline&height=36&originHeight=36&originWidth=438&size=0&status=done&width=438
以 :作为分隔符,取第一行第二列
1562288684477-a139ba7e-d90e-4bc3-9c01-12c41b85b557.png#align=left&display=inline&height=156&originHeight=156&originWidth=301&size=0&status=done&width=301
②awk 'BEGIN{FS=":"}NR==1{print $2}' oldboy.txt
1562288684269-46b3a1bc-8f3f-4823-9ff2-158f05e61d1d.png#align=left&display=inline&height=39&originHeight=39&originWidth=478&size=0&status=done&width=478
③awk -vFS=":" 'NR==1{print $2}' oldboy.txt
1562288684444-9beac038-9c32-4237-89be-07576c26e102.png#align=left&display=inline&height=37&originHeight=37&originWidth=442&size=0&status=done&width=442

END:在处理文件之后再执行的动作
awk 'END{print "总结:这是一个学生登记表"}{print $0}' oldboy.txt|column
1562288684282-1ae2f419-9a8a-4cba-9eba-a87c62f0873d.png#align=left&display=inline&height=158&originHeight=168&originWidth=659&size=0&status=done&width=620

1.5 awk统计运算

1、计算空格出现的次数:
awk '/^$/{i=i+1}END{print i}' /etc/services
1562288684441-281ce41e-1c03-4cad-acde-ad8069e6139b.png#align=left&display=inline&height=38&originHeight=38&originWidth=457&size=0&status=done&width=457
2、统计/etc/passwd文件中最后一列有/sbin/nologin的出现了多少次
①awk -F ":" '$NF~/nologin$/{i++}END{print i}' /etc/passwd
②awk '/nologin$/{i++}END{print i}' /etc/passwd
1562288684543-79424883-cad7-45cc-8985-ba76e75d65a9.png#align=left&display=inline&height=64&originHeight=64&originWidth=557&size=0&status=done&width=557
i=i+1 = i++ 累加运算:计算文件中一个字符串出现的次数
3、求和运算
seq 10|awk '{i=i+$1}END{print i}'
1562288684568-3787837f-1523-4f6b-82ae-a21a5399ce80.png#align=left&display=inline&height=37&originHeight=37&originWidth=387&size=0&status=done&width=387
补充
NF : 显示最后一列信息 $(NF-1) 取倒数第2列
NR : 表示行号信息0,取出第几行 NR==2 NR>=2 NR<=2
FS : 指定分隔符信息 -F
$1: 表示取第一列
$NF:表示取最后一列信息
$: 表示取一行中所有的列
-F : 指定分隔符号信息 ":" "[:/]" "[:/]+"
-v : 设置变量信息

1.6 利用awk取出ip地址

第一步:定位有ip地址的行
ip a s eth0|awk 'NR==3'
1562288684322-20f54233-1148-4166-953d-02d9bd155d5a.png#align=left&display=inline&height=38&originHeight=38&originWidth=397&size=0&status=done&width=397
第二步:只显示ip地址
ip a s eth0|awk -F "[ /]+" 'NR==3{print $3}' 用-F指定参数的时候,开头的^和空格都属于列
ip a s eth0|awk -F "[^0-9.]+" 'NR==3{print $2}'
1562288684335-1314bc5e-944e-4db8-b629-487eb3aa619f.png#align=left&display=inline&height=67&originHeight=67&originWidth=494&size=0&status=done&width=494
在不指定-F参数信息时,
1. 默认将多个连续的空格汇总为整体
2. 默认将一行头部开始空格信息忽略不计
用-F指定参数的时候,开头的^和空格都属于列

转载于:https://www.cnblogs.com/basa/p/11136365.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值