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

发布时间:2024年01月06日

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 
文章来源:https://blog.csdn.net/qq_59207739/article/details/135421703
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。