目录
一、akw原理
二、命令格式
三、常用变量
四、awk的用法
1.输出整行内容
2.按字段输出文本内容
3.按列输出文件内容 FS变量为列分隔符
4.awk的三个模式
5. awk ‘控制语句条件 {操作}’ 文件
6.awk的数组
7.awk的应用
一、akw原理
逐行读取文本,默认以空格或tab键为分隔符分割,将行内容分隔成各个字段保存到内建变量中,并按模式或条件执行编辑命令。与sed命令不同的是,sed常用于整行的处理,awk倾向于将一行内容分成多个字段再处理。在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
二、命令格式
awk 选项 ‘模式或条件 {操作}’ 文件1 文件2...
awk -f 脚本文件 文件1 文件2...
三、常用变量
- FS:列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
- NF:当前处理的行的字段个数。
- NR:当前处理的行的行号(序数)。
- $0:当前处理的行的整行内容。
- $n:当前处理行的第n个字段(第n列)。
- FILENAME:被处理的文件名。
- RS:行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是'\n'
四、awk的用法
1.输出整行内容
awk '{print $0}' 文件名 #打印所有行内容
awk 'NR==1{print $0}' 文件名 #打印第1行内容
awk 'NR>=10{print $0}' 文件名 #查看文件第十行及后面所有行的内容
awk '/^字符串/{print $0}' 文件名 #查看文件以“字符串”开头的所有行内容
awk '/字符串$/{print $0}' 文件名 #查看文件以“字符串”结尾的所有行内容,如果存在/,需要用\转义。
awk '(NR==10)||(NR==30){print $0}' 文件名 #查看文件的第10行和第30行内容
查看区间1-3行内的内容方法一:awk 'NR==1,NR==3{print $0}' 文件名
查看区间2-7行内的内容方法二:awk '(NR<=7)&&(NR>=2){print $0}' 文件名
awk '(NR>=7)||(NR<=2){print $0}' 文件名 #查看文件前2行和7行之后的内容
awk '/\/bin\/bash$/{print $0}' 文件名 #查看文件以/bin/bash结尾的行内容
awk '(NR%2)==0 {print $0}' 文件名 #打印文件的偶数行内容
awk '(NR%2)==1 {print $0}' 文件名 #打印文件的奇数行内容
awk '{print FNR,$0}' 1.txt 2.txt #同时打印多个文件使用FNR显示行号不会连续计数
awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd #统计文件中以XX结尾的行
2.按字段输出文本内容
awk -F '字段分隔符' 'NR==n {print $0}' 输出 第n行的 整行内容
awk -F '字段分隔符' 'NR==n {print $1}' 输出 第n行的 第一个字段的内容
awk -F '字段分隔符' 'NR==n {print $1,$NF}' 输出 第n行的 第一个字段和最后一个字段的内容
awk -F '字段分隔符' 'NR==n,NR==M {print $1}' 输出 第n行到第m行的 第一个字段的内容
awk -F '字段分隔符' 'NR>=n&&NR<=M {print $1}' 输出行号大于等于n且小于等于m的行的第一个字段内容
awk -F '字段分隔符' 'NR==n||NR==M {print $1}' 输出 第n行和第m行的 第一个字段的内容
awk -F '字段分隔符' '/字符串/ {print $1}' 输出包含指定字符串的行的 第一个字段的内容
awk -F '字段分隔符' '/正则表达式/ {print $1}' 输出 匹配正则表达式的行的 第一个字段的内容
awk -F '字段分隔符' '$1>=n {print $0}' 输出第一个字段的数值大于等于n的 整行内容
== != >= > <= <
awk -F '字段分隔符' '$1~"字符串" {print $0}' 输出第一个字段包含指定字符串的 整行内容
~(包含) !~(不包含) ==(等于) !=(不等于)
awk -F 指定分割符查看文件中以XX结尾的行内容的第x个字段
awk -F 指定分割符查看文件的多个字段
awk -F 指定分割符查看文件的第一个字段和最后一个字段(NF默认每行的字段数,每行字段不一致的话可以用$NF表示最后一个字段)
用FS="分隔符" 查看指定字段(FS是列分割符的意思,先指定为":"再去执行,效果与awk -F相同)
awk -F: '$3<5 {print $0}' /etc/passwd #查看文件第三个字段小于5的行内容
awk -F: '$3<5 {print $1,$NF}' /etc/passwd #查看文件第三个字段小于5的行,只显示第1个和最后一个字段
awk -F: '!($3<1000) {print $1,$NF}' /etc/passwd #查看文件第三个字段小于1000的行,显示第1和最后一个字段
awk -F: '!($3<1000) {print $0}' /etc/passwd #查看文件第三个字段小于1000的行,显示整行内容
awk -F: '($3<5) {print NR; print $0}' /etc/passwd #查看文件第三个字段小于5的行,显示行号和整行内容
awk -F: '$7~"bash" {print NR,$0}' /etc/passwd #查看第n个字段包含xx字符的行号和行内容
awk -F: 'NR==1||NR==2 {print $1}' /etc/passwd #查看第一行和第二行的行的第一个字段
awk -F: 'NR>=3&&NR<=5 {print $0}' /etc/passwd #查看行号大于等于三小于等于5的整行内容
awk 'BEGIN{OFS=":"};{$1=$1;print $0}' #指定输出内容的分隔符
3.按列输出文件内容 FS变量为列分隔符
awk ‘BEGIN{RS":"}; {print $0}’ 指定列分割符为冒号输出整行内容
awk -F/ ‘BEGIN{RS":"}; {print $2}’ #指定列分割符为冒号,行分割符为斜杠,输出第二个字段的内容
4.awk的三个模式
awk三个模式里,多个大括号可以执行多个操作,也可以把对个操作用分号间隔合并到一个大括号里。
格式:awk ‘BEGIN {x=0}; 条件{...};END{...}’ 文件
- begin表示处理文件前执行的操作;
- 条件表示对匹配满足指定条件的文件行内容执行操作;
- end表示处理完文件所有航内容后要执行的操作。
5. awk ‘控制语句条件 {操作}’ 文件
awk '变量=条件表达式?值1:值2; {操作}' 文件 #行内容是否符合表达式,如果条件成立则变量取值1,条件不成立则变量取值2。【三元运算符 条件表达式?值1:值2】
awk '{if(语句条件) {操作}}’ 文件 #满足if的条件的行 则执行操作
awk 'BEGIN while("命令" | getline)每次循环的操作;{操作}' getline获取行内容并跳到下一行
6.awk的数组
awk 'BEGIN{a[0]=10;a[1]=20; print a[1]}' --->输出结果为20
awk 'BEGIN{a[0]=10;a[1]=20; print a[0}}' --->输出结果为10
awk 'BEGIN{a["abc"]=10;a["xyz"]=20;print a["abc"]}' --->输出结果为10
awk 'BEGIN{a["abc"]=10;a["xyz"]=20;print a["xyz"]}' --->输出结果为20
awk 'BEGIN{a["abc"]="aabbcc";a["xyz"]="xxyyzz";print a["xyz"]}' --->输出结果为xxyyzz
awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;for(i in a){print i,a[i]}}' i 遍历的是变量a的下标
注意:BEGIN中的命令只执行一次。awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号
7.awk的应用
awk查看内存使用率
free | awk '/Mem:/{print int($3/$2*100)"%"}'
awk命令查看cpu使用率
top -b -n1 | awk -F, '/^%Cpu/{print $4}' | awk '{print 100-$1"%"}'
awk查看磁盘使用率
df | grep -w "/" | awk '{print $5}' | awk -F% '{print 100-$1"%"}'
awk查看系统运行时长
date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y%m%d %H:%M:%S"
awk获取IP地址
ifconfig ens33 | awk 'NR==2 {print $2}'
awk查看系统平均负载
uptime | awk -F, '{print $3}' | awk '{print $3}'
awk获取网卡流量
ifconfig ens33 | awk -F '(' '/RX packets/{print $2}' | awk -F ')' '{print $1}'
awk将ssh远程登录失败超过5次的IP导入到黑名单里