AWK:文本编辑器. 也是一种非交互式的编辑器,一种编程语言
功能:
对文本数据进行汇总和处理,是一个报告生成器,能够对数据进行排版
工作模式:
1. 行工作模式,读入一行文件,存在“$0”里
2. 使用内置变量FS(字段分隔符)分割一行,存到$1-$100
3. 输出时也是用内置变量OFS,输出该行
与sed主要异同:
相同点:
1.他们的语法基本相同
2.他们都是流编辑器,工作方式都是读入一行,处理动作,输出结果
3.他们都可以使用正则表达式作模式匹配
4.他们都允许使用脚本
不同点:
1.sed主要处理行,awk主要处理列
2.sed处理动作必须与文件内容相关,awk处理动作可以与文件内容无关,并且awk的动作要用{}括起来.
1. awk的语法:
awk [选项] '模式{动作...}' 文件列表...
2. 简单使用:
# awk -F: '/root/{print $1,$3,$4}' /tmp/pass
3. awk的模式匹配:
1)空模式:也就是每一行都处理的模式
2)正则表达式
a. 匹配行
b. 匹配范围
3)表达式
注意:awk是不支持使用行号定址的
4. 基本操作:
1) 设定输入分隔符 -F
分隔符可以是字母. 数字. 符号和空白,可以同时指定多个分隔符,默认是空白
——单个字符做分隔符
——复合分隔符,多个字符组成的分隔符 比如: :/
——同时指定多个分隔符 如:和/都是分隔符 # df -h |awk -F " +|%" '/\/$/{print $5}'
——每个字符都是一个字段 即以空为分隔符 # echo hello |awk -F "" '{print $1,$2}'
2) awk输出:
(1) print —— 打印内容可以是文件中内容. 也可以和文件无关
print要点:
a. 各个输出字段之间用逗号分隔,而输出时默认以空白分隔
b. print后面如果不指定字段,那么就会打印一整行
c.print输出时默认是有换行符的
(2) printf —— 可以格式化输出,默认没有换行
使用格式: printf "format",item1,item2,... ...,itemn
format的指示符都是以%开头的,后面跟一个字符表示不同的数据类型,如:
%s:表示是字符串
%d:表示十进制整数
%f:表示浮点数,也就是小数
%%:表示%本身
%x:表示十六进制数
%o:表示八进制数
%c :表示字符
修饰符:N(数字): 表示显示宽度 %5d
-:左对齐,默认是右对齐 %-5s
printf要点:
a. 与print不同的是,printf需要指定格式
b. 格式(format)是用来指定后面的每个item的输出格式
c. printf默认不会自动打印换行符,需要时候手动添加"\n"
d. printf默认没有输出分隔符
3)awk的操作符:
(1)算数运算符
-x:表示负数 +x(x):表示正数
x+y x-y x*y x/y x%y x**y x^y (x的y次幂)
(2)关系运算符
a. 数值之间的关系运算符 : > < >= <= == !=
b. 字符串之间的关系运算符:
== != ~ !~
$1=="root"
$1!="root"
x ~ /y/ —— 匹配正则
x !~ /y/ —— 不匹配正则
(3)逻辑运算符: && || !
(4)赋值运算符(详见变量):
= += -= *= /= %= **= ^=
++ --
5. awk的变量: 内置变量,自定义变量
1)内置变量
(1) $0 表示一整行的内容
(2) $1~$100
$1:第一列
$2:第二列
... ...
$100:第100列
(3) 与记录相关的变量
FS(Field Separator):字段分隔符,默认是空白
RS(Record):记录分隔符,即行的分隔符
OFS(Output):输出字段分隔符
ORS:输出记录分隔符
(4) 与数据相关的变量
NR:记录数,awk所处理的记录的总数 NR在很多情况下可以看成行号
FNR:当前文件所处理的记录数
NF:当前行的字段数
$NF:当前行最后一个字段的值
$(NF-1):当前行倒数第二个字段的值
2)自定义变量
命名:由字母. 数字. 下划线组成,不能以数字开头,不要使用关键字,最好见名知意
变量名区分大小写,变量可以先定义再使用,也可以直接使用(整型)
给变量赋值:
变量名=数值
变量名="字符串" 注意:此处一定有引号
6. 赋值运算
a+=$2 等效于 a=a+$2
a+=5 等效于 a=a+5
a++ 先赋值,再自增
++a 先自增,再赋值
7. awk的特殊模式
awk [选项] 'BEGIN{动作}模式{动作}END{动作}' 文件列表
BEGIN{} :在读取文件之前就执行,并且只执行一次
模式{}: 这一部分可能会执行多次
END{}: 在处理完文本之后执行,并且只执行一次
BEGIN: 一般用于初始化分隔符. 定义变量. 定义数组. 打印表头等
END: 汇总数据 比如:打印总成绩. 打印平均成绩等等1C}
说明:
BEGIN和END可以单独存在
1)只有BEGIN,后面不需要加文件
2)只有END 后面必须接文件,文件可以是空文件,也可以是有内容的文件
网友评论