awk:流文本处理工具
awk是一种编程语言,用于对文本和数据的处理,数据可以来则标准输入、一个或多个文件,它支持用户自定义函数和动态正则表达式等功能,awk处理文本和数据的方式是:
逐行扫描文件,从第一行到最后一行
寻找匹配特定模式的行,并进行需要进行的操作
awk使用每一行输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符结束,然后,行被(默认为空格或制表符)分解成字段(或称为域),每个字段存储在已编号的变量中,awk输出之后,将从文件中获取另一行,并将其存储在$0,覆盖原来的内容,然后将新的字符串分割成字段进行处理,该过程将持续到所有行处理完毕
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 -F: '{for(i=1;i<=2;i++) {print $0}}' passwd
分别打印每行每列
awk -F: '{for(i=1;i<=NF;i++) {print $i}}' passwd
awk 'BEGIN{开始输出}{if(条件){print $0}else{}}END{结尾输出}' 文件名
\\ \自身
\$ 转义$
\t 制表符
\b 退格符
\r 回车符
\n 换行符
\c 取消换行
+ 加
- 减
* 乘
/ 除
& 求余
|| 逻辑或
&& 逻辑与
~ 匹配正则表达式
!~ 不匹配正则表达式
< 小于
<= 小于等于
> 大于
>= 大于等于
!= 不等于
== 等于
统计文件内的性别人数
命令行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