一、awk是什么?
awk是一种编程及数据操作语言(其名称来自于创始人lfred Aho、Peter Weinberger 和 Brian Kernighan 姓氏的首字母)
(Gawk is the GNU Project's implementation of the AWK programming language.
gawk - pattern scanning and processing language)三个作者首字母的组合。
1、GNU是什么?
GUN is not uninx。
GUN是一个项目,它的宗旨是构建一个不是uninx的操作系统,项目发起人理查德.斯德尔曼。
操作系统:内核+应用程序+库+解析器等。
内核kernel---linux
2、相关命令选项
awk -F ":":表示接分隔符为":"
~/^luo/:模糊查找以/luo/开头的。并且以luo开头的用户名的长度大于1的。
[root@localhost lianxi]# useradd luoziyao useradd:用户“luoziyao”已存在 [root@localhost lianxi]# awk -F ": " '$1~/^luo/ && length($1>4) {print $1,$3}' /etc/passwd luoziyao 2021
3、awk有什么用
过滤+截取+统计
4、awk用在哪里
文本处理(截取和统计)
充值记录:bill.txt
feng 100
feng 200
feng 350
li 200
ma 100000
li 239
li 890
zhang 100
zhang 350
ma 1000
统计每个用户一共充值了多少钱?--》求和,分类统计。
[root@localhost lianxi]# awk '{name[$1]+=$2}END{for (i in name) print i,name[i]}' bill.txt li 1329 feng 650 zhang 450 ma 101000
①name[1]+=1]+=2 拿1字段做key,让1字段做key,让2做value,如果数组里有key,就累加,如果没有,初始值是0+value。
②END{for (i in name) print i,name[i]}:END是文件里所有的行都处理完了,最后去执行END部分里的命令。for循环取遍历name数组里的元素(item),i 取name数组里的key,输出key和对应的value。
字段:field --一段文字被分隔符隔开,形成很多段比较短的文字
luoziyao:x:2021:2024::/home/luoziyao:/bin/bash
=====
列: --字段:column
行: row line record
记录:record
一行就是一条记录。
====
二、awk 命令的简要处理流程
使用awk命令可以按照分割符将一行分割为多个列,第一列用1表示,第二列用1表示,第二列用2表示,依次类推。
awk -F ":":表示接分隔符":",将数据格式化成几段。
$0表示存储的是整行数据。
[root@localhost lianxi]# awk -F ":" '{print $1,$3,$7}' /etc/passwd
1、分隔符
awk截取文本时,会按照指定的分隔符去分隔,默认的分隔符是空格,使用- F可以指定分隔符。
(1)输入分隔符FS/F:input field separate
格式:awk -F 【分隔符】
-F --FS :输入分隔符变量。默认是空白(空格和tab键),可以进行指定。
(2)输出分隔符 OFS:output field separate
OFS=: 输出分隔符变量, 默认是一个空格。就是以什么分隔符来输出内容。
比如:OFS="#':表示以"#"进行分隔
例如:
①输出分隔符以逗号隔开为默认。输出结果为空格隔开。
[root@localhost lianxi]# awk -F ":" '{print $1,$3,$7}' /etc/passwd|head root 0 /bin/bash bin 1 /sbin/nologin
②输出分隔符没有进行分隔,结果输出的也没有没有分隔。
[root@localhost lianxi]# awk -F ":" '{print $1$3$7}' /etc/passwd|head root0/bin/bash bin1/sbin/nologin daemon2/sbin/nologin adm3/sbin/nologin
③ 输出分隔符以空格隔开,输出的结果也没有分开。
[root@localhost lianxi]# awk -F ":" '{print $1 $3 $7}' /etc/passwd|head root0/bin/bash bin1/sbin/nologin daemon2/sbin/nologin
④ OFS=:output field separate ,指定输入的内容是以“:”分开的,然后指定输出内容的分隔符为"#"。
[root@localhost lianxi]# awk -F ":" 'OFS="#"{print $1,$3,$7}' /etc/passwd|head root#0#/bin/bash bin#1#/sbin/nologin
三、awk命令的内置变量
名称 | 用途 |
NF | 每行$0(最后一个字段)的字段,The number of field in the current input record |
NR | 当前处理的行号,The total number of input record seen so far |
FS | 当前的输入分隔符,默认是空白字符(空格和tab),field separate,如:FS=":",表示输入内容是以:分隔开的 |
OFS | 当前的输出分隔符,默认是空格字符(空格),output field separate 如:OFS="#"表示输出的内容以#分割开。 |
$NF:最后一个字段
$(NF-1):倒数第2个字段
扩展:cat -n 、nl:以行号的形式输出。
[root@localhost lianxi]# cat -n /etc/passwd|head 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin ......... [root@localhost lianxi]# nl /etc/passwd|head 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin ........................
w:查看连接到你的机器上的有哪些机器。
查看连接到你机器的机器,并且截取出第一个字段。
[root@localhost lianxi]# w|awk '{print $1,$NF}' 14:58:29 0.05 USER WHAT root -bash root w
四、awk命令的完整语法
1、格式
awk 'BEGINK{commands}pattern{commands}END{commands}' file1
练习:①、截取出/etc/passwd中第三个字段大于500,并且小于1000的那部分内容。
[root@localhost lianxi]# awk -F ":" 'BEGIN{print "####start####"} $3>500&&$3<1000{print $1,$3}END{print "####end####"}' /etc/passwd|head ####start#### polkitd 999 chrony 998 zabbix 997 nginx 996 grafana 995 ####end####
②、查找/etc/passwd文件中包含feng的内容或者字段3大于1005的,并打印出每行的字段数、行号、第一个字段和第一个字段的长度、倒数第二个字段、第三个字段。
[root@localhost lianxi]# cat /etc/passwd|awk -F: 'BEGIN{num=0;print"开始统计/etc/passwd文件"}$1 ~/feng/ || $3 > 1005 {print NR,NF,$1,length($1),$(NF-1),$NF,$3,num++}END{print "统计结束",num}'
③、截取以feng开头的2次以上,并且第三个字段大于2000的,或者最后一个字段是含有bash的,然后打印出行号、每行的字段数,字段1、字段3以及字段1的长度、倒数第二个字段,最后一个字段。
[root@localhost shell]# awk -F: 'BEGIN{num=0;print "start"} $1 ~ /^feng{2,}/ && $3 >2000 || $NF ~ /bash/ {print NR,NF,$1,$3,length($1),$(NF-1),$NF;num++} END{print "行数:"num}' /etc/passwd 1 7 root 0 4 /root /bin/bash 20 7 angel 1000 5 /home/angel /bin/bash 21 7 aj 1001 2 /home/aj /bin/bash 22 7 qiantao 1002 7 /home/qiantao /bin/bash 23 7 yalin 1003 5 /home/yalin /bin/bash 24 7 jj 1004 2 /home/jj /bin/bash 25 7 aojiao 1005 6 /home/aojiao /bin/bash 30 7 sc 1006 2 /home/sc /bin/bash 31 7 sl1 1007 3 /home/sl1 /bin/bash ........... 行数:57
④、who的用法:
who命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等。
[root@localhost lianxi]# who|awk '{print "username:"$1" time:"$3}' username:root time:2022-07-07 username:root time:2022-07-07 username:root time:2022-07-07 [root@localhost lianxi]# who|awk '{print "username:"$1", uid:"$3}' username:root, uid:2022-07-07 username:root, uid:2022-07-07 username:root, uid:2022-07-07 [root@localhost lianxi]# who|awk '{print "username:"$1", uid:"$3}' /etc/passwd|head -5 username:root:x:0:0:root:/root:/bin/bash, uid: username:bin:x:1:1:bin:/bin:/sbin/nologin, uid: username:daemon:x:2:2:daemon:/sbin:/sbin/nologin, uid: username:adm:x:3:4:adm:/var/adm:/sbin/nologin, uid: username:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin, uid:
[root@localhost lianxi]# awk -F: '/bash/{print "username:"$1", uid:"$3}' /etc/passwd|head -5 username:root, uid:0 username:angel, uid:1000 username:aj, uid:1001 username:qiantao, uid:1002 username:yalin, uid:1003 [root@localhost shell]# awk -F: '{print "username:"$1", uid:"$3}' /etc/passwd|head -5 username:root, uid:0 username:bin, uid:1 username:daemon, uid:2 username:adm, uid:3 username:lp, uid:4
⑤、截取出每个人所对应的语文和Linux成绩。
[root@localhost shell]# cat grade.txt id name chinese math english//linux 1 cali 80 80 80//88 2 rose 90 70 90//78 3 tom 70 100 85//22 4 jenny 100 60 90//95 root@localhost shell]# awk -F"[ /]+" '{print $2,$3,$6}' grade.txt name chinese linux cali 80 88 rose 90 78 tom 70 22 jenny 100 95
2、 awk 中 gsub和tr命令的使用
1、gsub:替换
格式:gsub(r,s [, t]): For each substring matching the regular expression r in the string t,substitute,substitue the string s,and return the number of substituions。
练习:将$5对应的字符串里查找“/”字符串,并将其替换成" "空格。
[root@localhost shell]# awk '{gsub("/"," ",$5); print $2,$3,$5}' grade.txt name chinese englishlinux cali 80 8088 rose 90 9078 tom 70 8522 jenny 100 9095
2、 tr命令:字符转换和删除
① tr:translate or delete characters 将字符进行转换和删除。
练习:tr '/' "\t":进行替换,将“/”替换成"\t";"\t";table键
root@localhost shell]# cat grade.txt|tr '/' "\t" id name chinese math english linux 1 cali 80 80 80 88 2 rose 90 70 90 78 [root@localhost shell]# cat grade.txt|tr '//' "\t" id name chinese math english linux 1 cali 80 80 80 88 2 rose 90 70 90 78 .........
将a替换为8,将b替换为9。
[root@localhost shell]# echo aaaaaabbbbcccc123 |tr ab 89 8888889999cccc123 [root@localhost shell]# echo aaaaaabbbbccccbbbcc123 |tr ab 89 8888889999cccc999cc123
②tr -s:替换并去重。
-s :suqeeze -repreats:压缩连续的相同(重复)的字符串为一个字符串。
#将“/”替换为空格并压缩 [root@localhost shell]# cat grade.txt|tr -s "/" " " id name chinese math english linux 1 cali 80 80 80 88 2 rose 90 70 90 78 3 tom 70 100 85 22 4 jenny 100 60 90 95
[root@localhost shell]# cat grade.txt |tr -s "/" " "|awk '{print $2,$3,$NF}' name chinese linux cali 80 88 rose 90 78 .........
③ tr -d:删除字符串 delete,delete character in SET1 ,do not translate
格式: tr [OPTION.....SET1 [SET2]
SET1和SET2字符串一一对应替换
练习:①删除”%“的那一列。
[root@localhost shell]# df|tr -d "%" #删除”%“的那一列 文件系统 1K-块 已用 可用 已用 挂载点 /dev/mapper/centos-root 17811456 7714488 10096968 44 / devtmpfs 485780 0 485780 0 /dev tmpfs 497948 0 497948 0 /dev/shm
文本三剑客——awk 截取+过滤+统计(2)+https://developer.aliyun.com/article/1557888