AWK命令

awk命令格式

image
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)}'
posted @ 2026-01-28 15:31  Dswtao  阅读(0)  评论(0)    收藏  举报