awk
1、awk介绍
全称:Aho Weinberger Kernaighan 三个人的首字母缩写
grep 行过滤器
-o -i -v取反 -E正则表达式 grep egrep fgrep(匹配速度最快)
sed 行编辑器
-n p 1、地址定界 2、命令 p a i w c \ s/pat/str/ g|&
awk 报告生成器
通过模式匹配以及自己本身的语言格式,来获取,并输入
【默认情况下,三个工具都不去编辑源文件】
FS=" "指定分隔符
2、awk原理
3、awk用法
awk 选项 ... 'program' file...
1、program 必须使用!单引号!
2、多条program语句使用大括号包含起来,可以并列,可以嵌套
awk '{print}' /etc/passwd
4、potion
-F 指定分隔符
awk -F[/:] '{print $1,$3}' a.txt
其中[ ]内表示多个字符中的任意一个
-v 因为awk是一种语言编辑器,能自己定义变量,同时也有内置变量(与环境变量类似)
手动指定变量参数
awk -v a="a/b" '{print }' a.txt
给a赋值,打印a这个变量
1、a是自定义变量 -v FS=":"
2、在awk中调用变量 不用加¥符号
awk '{a="a/b";print a}' a.txt
扩展: 了解cut 与awk的区别
5、awk自己的固定语法语句
1、print
默认输出(在屏幕上)
在awk中没有保存命令,我们可以关联别的命令来保存awk的结果
awk '{a="a/b";print a}' a.txt | tee a.bak
2、printf ---实现格式化输出
格式符
%s 字符串
%d %i 数值
%e %E 科学计算数值
%c Acsii码值
%f 浮点数
%u 无符号整数
%% 逃逸符 只显示%自己
修饰符
默认为右对齐
- 代表左对齐
%5.4f
5 所占位属
4 所取小数位
3、变量(内置变量、自定义变量)
内置变量 ---环境变量(bash)(env、set -C +C)
awk语言所默认支持的变量
FS 定义输入分隔符的变量
OFS 定义输出分隔符的变量
NF 定义行分割以后的参数个数($NF 分割以后最后一列的变量)
变量引用的时候不用加$,$0,$1....$n
NR 定义文件的行数,定义多个文件的文件行,行号叠加
FNR 文集只计算自己的行号
begin{语句}只在行循环开始时,执行一次
ARGC 整个命令的段数 [注意:不包含'program'本身]
ARGV 数组,用来调用命令中,指定的段ARGV[2] 【注意:数组中也不包含'program'】
RS 指定换行符 \n可以指定新的换行符,不影响本身的换行
ORS 输出的时候指定的换行符,将默认换行符替换为指定字符
自定义变量
-v 变量=值
在后面'program'中去调用自定义变量时,直接使用即可或者将“变量=值”语句直接写 在’program‘亦可
4、模式匹配(地址定界)
1、空值、没有定义,默认就将文本所有的行,放入awk进行循环
2、对固定的1,3行进行操作
sed -n '1,3p' /etc/passwd
awk '1,3{print}' /etc/passwd ///awk默认不支持1-3 1,3等等,这样数值的直接写法;
awk 'NR>=1&&NR<=3{print}' /etc/passwd //通过NR变量来指定
3、/pat1/
sed -n /pat1/p /etc/passwd
awk '/r..ter/{print}' /etc/passwd
4、/pat1/,/pat2/ 第一次匹配pat1到第一次匹配pat2,之间的行
5、模式匹配可以直接使用判断语句
awk -F:'$NF=="/bin/bash"{print $1,$3}' /etc/passwd
6、BEGIN在默认循环进行操作前所要执行的语句;
5、操作符
运算操作符:
+ - * / % ** // ^
比较运算符
== ! = > < >= <=
~!~
逻辑操作符
&& || !
赋值操作符:
= += -= /= *= %= ^= //=
条件表达式:
语句条件? 条件成立语句;条件 不成立的语句
6、常见action
print printf 以及他任何命令的操作都是action
1、expressions
2、control statement 控制语句 例如: if while等
逻辑关系语句判断来进行结合
3、组合语句 compound statements
/pat1/{{ }{;}}
4、input statements输入语句
5、output statements 输出语句
7、常见语言(if while do for break continue )
1、if语句
语法格式:if(条件表达式){执行语句}
if(条件表达式){执行语句} else {执行语句}
awk '/^title/{if(NF<=2) {print}else {print "参数过少"}}' /boot/grup/grup.conf
awk '/^title/{if(NF>=2) print $4}' /boot/grup/grup.conf
2、while语句
只有对行参数进行遍历的时候才会使用循环;
语法格式:while(条件表达式){循环体}
8、数组
在awk中,数组和shell中的数组特性相同
注意:awk中数组不用定义,只要使用了,就有值为空的默认数组;这在做数据统计的时候非常常见!!!!!
行遍历 - --> 实际上就是整个文件的遍历
列遍历 ----> 取对象固定某列中的相同数据的统计
注意:数组通过for语句再给其他变量进行赋值的时候,赋值的是index索引信息;
9、函数
1、内置函数
函数的调用:funcation(参数)
length() 统计字符串长度
数学运算上使用的函数 sin() cos().....
sub(x,x,x) 替换第一个匹配到的值
gsub(x,x,x) 替换该行所匹配道德所有值
split(x,x,x) 指定分隔符去切割文件
2、自定义函数