1、awk介绍
在linux上实际上叫做gawk;
grep:行过滤器
sed:行编辑器
awk:报告生成器
通过模式匹配以及自己本身的语言格式,来获取并输出客户所需要的内容;
【默认情况下,三个工具都不去编辑原文件】
示例:获取系统上面用户id大于等于1小于等于500的用户的用户名和用户ID
for i in $(cut -d: -f3 /etc/passwd);do
if [ $i -ge 1 -a $i -le 500 ];then
echo grep $i | cut -d: -f1,3
fi
done
#awk -F: '{print $3}'
2、awk工作原理
依次把匹配到的行使用awk工具进行编辑或者格式化输出,所以,关于行的循环,awk就不用去理会了。
1、做分割
2、pattern;通过模式匹配对应的字段,过滤行;
(地址定界)
3、通过对应的命令(printf)做格式化输出
【难点:关联逻辑语句,它有自己的语法格式;】
3、awk的用法
awk [option]... 'program' FILE...
1、program 必须使用单引号!!!!
2、多条program语句使用大括号包含起来,可以并列,可以嵌套
awk'{print}' /etc/passwd
4、awk的常见option
-F 指定分隔符
awk -F[/:] '{print $1,$3}' a.txt
其中[]内表示多个字符中的任意一个
-v 因为awk是一种语言编译器,能自己定义变量,同时也有内置变量(与环境变量类似)
手动指定参数
awk -v a="a/b" '{print a}' a.txt
给a赋值,打印a这个变量
1、a是自定义变量 -v FS=":"
2、在awk中调用调用变量 不用加$符号
awk '{a="a/b";print a}' a.txt
扩展:了解cut与awk的区别;
5、awk的语法格式 -- program
1、print
默认输出(在屏幕上)
在awk中没有保存命令,我们可以关联别的命令来保存awk的结果
awk '{a="a/b";print a}' a.txt | tee a.bak
2、printf --- 实现格式化输出
printf"%s是%d班学的最好的学生",变量1,变量2
【仅仅只有顺序关系】
格式符:
%s 字符串
%d %i 数值
%e %E 科学计算数值
%c ASCII码值
%f 浮点数
%u 无符号整数
%% 逃逸符 只显示%自己
修饰符:
默认为右对齐
- 代表左对齐
%5.4f 5代表所占位数
4代表所取小数位
3、变量(内置变量、自定义变量)
内置变量 -- 环境变量(bash)(env、set、-C +C)
awk语言默认支持的变量
FS 定义输入分隔符的变量
OFS 定义输出分隔符的变量
NF($NF 定义行分割以后最后的一列变量)
*变量引用的时候,不用加$,
NR 定义文件的行数,定义多个文件的时候文件的行号叠加
FNR 文件只计算自己的行号
awk '{print NR}' /etc/passwd
awk '{print NR}' /etc/passwd /etc/fastab
FILENAME 存储文件的名字
awk '{print FILENAME}' /etc/passwd //把文件名打印N次,N文件的行数
awk 'BEGIN{print NR}' /etc/passwd
//BEGIN 只在行循环开始时,执行一次
ARGC 整个命令的段数【注意:不包含命令本身自己(也就是ARGC所在的段)】
awk '{print ARGC}' /etc/passwd
ARGV 调取命令中指定的段【注意:数组中也不包含命令本身自己】
RS 指定换行符【注意:可以指定新的换行符,不影响本身的换行符】
ORS 输出的时候指定的换行符,将默认换行符替换为指定字符
awk -v ORS=' ' '{print}' /etc/passwd //将默认换行符指定为空格
自定义变量
-v 变量=值
在后面'program'中去调用自定义变量时,直接使用即可
或者将"变量=值"语句直接写在'program'亦可;
awk -v a="a/b" '{print a}' a.txt
awk '{a="a/b";print a}' a.txt