当前位置: 首页 > news >正文

linux系统shell流文本处理工具——awk

awk

  • awk数据处理
    • awk工作原理
    • awk语法
    • 特殊变量
    • awk使用for
    • awk使用if
    • 转义序列
    • 运算
      • 算数运算
      • 逻辑运算
      • 正则运算
      • 关系运算
    • awk脚本示例

awk数据处理

awk:流文本处理工具

awk是一种编程语言,用于对文本和数据的处理,数据可以来则标准输入、一个或多个文件,它支持用户自定义函数和动态正则表达式等功能,awk处理文本和数据的方式是:
逐行扫描文件,从第一行到最后一行
寻找匹配特定模式的行,并进行需要进行的操作

awk工作原理

awk使用每一行输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符结束,然后,行被(默认为空格或制表符)分解成字段(或称为域),每个字段存储在已编号的变量中,awk输出之后,将从文件中获取另一行,并将其存储在$0,覆盖原来的内容,然后将新的字符串分割成字段进行处理,该过程将持续到所有行处理完毕

awk语法

awk [options] 'commands' 文件名
					
options:
-F   定义输入字段分隔符,默认分隔符是空格或制表符(tab)
-f   指定一个规则文件 
-v   赋值一个用户定义变量,将外部变量传递给awk
-mf N 指定要处理的数据文件中的最大字段数
-mr N 指定数据文件中的最大数据行数
-W keyword 指定awk的兼容模式或警告等级
commands:
BEGIN{}:begin发生在行处理之前
						
{}:行处理时,读一次执行一次
						
END{}:行处理之后

特殊变量

默认分隔符是空格或者tab键

NF: 表示字段数量, 当awk将行为记录时      //该变量相当于当前列号
FS(输入字段分隔符)     //更改文件分割符,与参数-F作用相似
awk 'BEGIBN{FS=":"}{print $NF}' passwd passwd 

OFS(输出字段分隔符)    //修改输出显示分隔符
awk 'BEGIN{FS=":";OFS=".."} {print $1,$2}' passwd 

NR(处理时候添加行号)   //处理时添加上行号,多文件时候,累加添加行号
awk 'BEGIBN{FS=":"}{print NR,$0}' passwd

FNR(处理时候添加行号)  //处理时添加上行号,多文件时候,按文件分别添加行号
awk 'BEGIBN{FS=":"}{print FNR,$0}' passwd passwd   

RS(输入记录分隔符)     //一行为一个记录,默认分隔符是换行符
awk -F: 'BEGIN{RS="\n"} {print $0}' passwd    //默认输入记录分隔符是\n

ORS(输出记录分隔符)    //一行为一个记录,默认分隔符是换行符
awk -F: 'BEGIN{ORS=" "} {print $0}' passwd    //输出分隔符修改为" "

NF(字段个数)          //NF是表示总列数,常用$NF来取最后一列
awk -F ":"  '{print $NF}' passwd    

awk使用for

每行打印两次
awk -F: '{for(i=1;i<=2;i++) {print $0}}' passwd 

分别打印每行每列
awk -F: '{for(i=1;i<=NF;i++) {print $i}}' passwd

awk使用if

awk 'BEGIN{开始输出}{if(条件){print $0}else{}}END{结尾输出}' 文件名

转义序列

\\ \自身
\$ 转义$
\t 制表符
\b 退格符
\r 回车符
\n 换行符
\c 取消换行

运算

算数运算

+ 加
- 减
* 乘
/ 除
& 求余

逻辑运算

||	逻辑或
&&	逻辑与

正则运算

~   匹配正则表达式
!~	不匹配正则表达式

关系运算

<   小于
<=  小于等于
>   大于
>=  大于等于
!=  不等于
==	等于

awk脚本示例

统计文件内的性别人数
命令行awk -f 文件名.awk
文件输入:

BEGIN{
    man=0
    woman=0
}
{if($3 == "女"){
    woman++
}else{
    man++
}
}
END{
    print "男生有:"man;
    print "女生有:"woman 
}

命令行输入
awk 'BEGIN{man=0;woman=0}{if($3 == "女"){woman++}else{man++}}END{print "男生有:"man;print "女生有:"woman }'
统计/etc/passwd文件中的登录shell
awk -f awk.awk passwd
awk.awk文件内容:
BEGIN{
FS=":"
}
{bash[$NF]++}
END{
for(i in bash){
print i,bash[i]
}
}

命令行输入
awk -F":" '{bash[$NF]++}END{for(i in bash){print i,bash[i]}}' passwd 

相关文章:

  • 使用IDEA官方docker插件构建镜像
  • 速学python·注释
  • openssl 命令详解
  • MySQL的CRUD操作函数介绍union和union all
  • 2023年终总结
  • Elasticsearch:使用 ELSER v2 文本扩展进行语义搜索
  • RoadMap8:C++中类的封装、继承、多态与构造函数
  • 宣传照(私密)勿转发
  • 使用.Net nanoFramework为ESP32进行蓝牙配网
  • Django 文件上传(十二)
  • prometheus grafana mysql监控配置使用
  • 【JAVA】泛型和Object的区别
  • 深入了解Swagger注解:@ApiModel和@ApiModelProperty实用指南
  • 外包干了3个月,技术退步明显.......
  • 使用 dbgate 在 sealos 上完美管理 mysql pgsql 等数据库
  • 14:00面试,14:08就出来了,问的问题过于变态了。。。
  • Mybatis行为配置之Ⅰ—缓存
  • Linux系统安装MySQL
  • 泛型擦除到底是怎么一回事
  • 福建科立讯通信 指挥调度管理平台 多处文件上传漏洞复现
  • 盐城经济技术开发区党工委书记王旭东接受纪律审查和监察调查
  • 法律顾问被控配合他人诈骗酒店资产一审判8年,二审辩称无罪
  • 女排奥运冠军宋妮娜:青少年保持身心健康才能走得更远
  • 朝鲜称将在各领域采取反制措施,应对美国敌对挑衅
  • 圆桌丨全球化博弈与人工智能背景下,企业如何落地合规体系
  • 媒体:中国女排前队长朱婷妹妹被保送浙大受质疑,多方回应