AWK命令
awk命令格式

awk指令是又模式,动作或者模式和动作的组合
模式: 可以理解为sed的模式匹配,可以由表达式组成如NR==1第一行,也可以由两个正斜杠之间的正则表达式,可以理解为一个触发条件
动作: action是由大括号{}里的一条或多条语句组成,语句之间使用分号隔开,最常用的动作print
小结
-
pattern和action都要用单引号,防止shell作特殊解释(是交给awk去执行的,而不是bash)
-
不指定模式,awk默认处理输入的文件数据,每一行,每一列
- 如果指定模式,例如指定的行,awk就处理指定那一行的数据
-
awk的动作,必须写在花括号里
{print}
awk字段 行/列
| 符号 | 作用 |
|---|---|
| NR | 行记录,行数据,处理第几行 |
| NF | 一行分几列 |
| $1 | 第一个字段的数据、$2、$3以此类推 |
内置变量
| 变量符号 | 作用 |
|---|---|
| FS | 字段分隔符默认是空格和制表符(列分隔符) |
| RS | 行分隔符,用于分隔每一行 默认换行符 |
| OFS | 输出分隔符用于打印时分隔字段默认空格 |
| ORS | 输出记录分隔符用于打印时分隔记录默认换行符 |
| OFMT | 数字输出的格式 默认% |
1 RS 以符号 分隔行输出
cat ceshi.txt | awk -v RS=' ' '{print $0,NR}'
2 修改ORS/修改awk输出显示
cat ceshi.txt | awk -v ORS="这个是表 \n" '{print $0}'
awk默认情况下 认为文件从头到尾是整行数据,直到碰到换行符 \n 回车换行符 因此本行结束,进入下一行。可以通过修改行输入的分隔符
awk操作
awk模式种类
1 正则表达式: 基本正则 扩展正则
2 比较表达式
3 范围表达式
4 特殊模式 BEGIN END
比较运算
| 关系运算符 | 解释 | 示例 |
|---|---|---|
| < | 小于 | x<y |
| <= | 小于等于 | x<=y |
| == | 等于 | x==y |
| != | 不等于 | x!=y |
| >= | 大于等于 | x>=y |
| > | 大于 | x>y |
| ~ | 匹配正则 | x~/正则/ |
| !~ | 与表达式不匹配 | x!~/正则/ |
正则表示式语法
正则表达式作用在于在行数据中匹配想要的字符串,然后执行对应的action动作
**语法**
awk '/正则表达式/{print $0}'
awk -F'分隔符 '/正则/{action}'
# 行 NR 列 NF 表示
awk -F ':' 'NR==1 {print $0}' /etc/passwd
awk -F ':' 'NR>=10 || NR<=20 {print $0}' /etc/passwd
# 比较操作
#awk -F ':' '$4 >= 1000 {print $0}' /etc/passwd
# $NF 一行最后一列的字符 pritn $0 输出一行的所有列
范围模式
可以用到正则,也可以用到比较运算符,范围模式就是从某一行到某一行,均是符号条件的行
# 范围显示 print 中NR就是输出行号 连续范围 正则或NR 行号之间用 ,
awk -F ':' '/^root/,/^mail/ {print NR,$0}' /etc/passwd
awk -F ':' '/^bin/,NR==5 {print NR,$0}' /etc/passwd
特殊模式BEGIN和END
BEGIN
BEGIN模式作用在awk开始读取文件行数据,之前就先执行,一般用于预定义一些操作,比如数据的表头格式化,BEGIN后面必须跟上action动作
# 语法
awk -F '分隔符' 'BEGIN{print "标头名"} /正则表达/ {print action}'
awk -F ':' 'BEGIN{print "用户名","家目录","解释器"}$1~/(root|mail|nobody|t5)/{print $1,$6,$NF}' /etc/passwd
可以计算器
awk 'BEGIN{print 9/3}'
END模式**
END就是awk结束后的操作,END是awk读取完成所有文件后,在执行END模块,一般用来总结,格式化打印一个结果,END仅会在awk所有行数据处理完毕后,执行END动作
# 语法 awk -F '分隔符' 'BEGIN{print "表头"} {print $NF} END{print $NF}'
awk -F ' ' 'BEGIN{print "姓名","性别","年龄"}{print $0} END{print"输出完毕"}' fiel1
awk -F ':' '{print $0}END{print "总行数: ",NR}' /etc/passwd
awk '/^$/{num+=1;print $0} END{print "空行数: ",num}' fiel1
其他模式
结合判断输出结果
*if判断在{} 中print输出依然还需要{}
awk '{if($8 == "R") {print $2,$NF}}'
输出整数不带单位
df -Ph | awk '{print int($5)}'
浙公网安备 33010602011771号