awk[单独的编程语言解释器]
一.awk介绍
全称:Aho Weinberger Kernaighan三个人的首字母缩写
1970年第一次出现在Unix机器上,后来在开源领域使用它;
所以,我们在Linux中使用。改名为GNU awk;所以,在Linux上实际上叫做GAWK;
gre 行过滤器
-o -i -v -E grep egrep fgrep[写什么就匹配什么]
sed 行编辑器
-n p地址定界【支持pattern】 2.命令 p a i w【只保存地址定界放进来的行】 c
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}'
awk默认分隔符为空格
二.awk工作原理
AWK 工作流程可分为三个部分:
- 读输入文件之前执行的代码段(由BEGIN关键字标识)。
- 主循环执行输入文件的代码段。
- 读输入文件之后的代码段(由END关键字标识)
三.awk用法
awk [option]...'program'FILE...
1.program 必须使用单引号
2.多条programe语句用{}隔开,可以并列,可以嵌套
awk'{print }'/etc/passwd
四.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
五.awk的语法格式 --programe
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所取小数位
awk '/^UUID/{printf "被挂载文件:%-50s挂载点:%-10s 文件系统格式:%-10s
"",$1,$2,$3}'/etc/fstab
注意:这里提到了地址定界
sed/PAT1/./PAT2/
3.变量(内置变量 自定义变量)
内置变量--环境变量(bash)(env set-C +C)
awk语言所默认支持的变量
FS 定义输入的分隔符的变量
OFS 定义输出分隔符的变量
NF定义分隔以后的参数个数($NF 分隔以后最后一列变量)
*变量引用的时候,不用加$,$0,$1...$n,
awk -v FS=":"//bash$/{print $1,$2,$NF}'/etc/passwd
NR定义文件的行数,定义多个文件的文件的,行号叠加
FNR文件只定义自己的行号
awk'{print NR}'/etc/fstab/etc/passwd
awk'{print FNR}'/etc/fstab/etc/passwd
FILENAME存储文件的名字
awk'{print FILENAME }'/etc/passwd //把文件名打印N次,N文件的行数
cut -d:-f1/etc/passwd5;g5
ARGC 整个命令的段数【注意:不包括awk本身】
ARGV 数组 用来调取命令中,指定的段ARGV【2】
awk 'BEGIN{print ARGC}'/etc/passwd/etc/fstab/etc/shadow
awk 'BEGIN{print ARGV[3]}'/etc/passwd/etc/fstab/etc/shadow
RS 指定换行符
ORS 输出的时候指定换行符
awk -v RS=" "'{print}'/etc/passwd
awk -v ORS="@"'{print}'/etc/passwd //可以用来取消换行符
自定义变量
-v变量=值
在后面programe中去调用自定义变量时,直接使用即可
或者将 ”变量=值“语句直接写在’programe‘即可