一.awk基础用法
awk -F参数
指定awk按照什么标志进行文件切割,切割成一列一列的
常见的格式:awk -F “指定分隔符”
如果我们不指定-F参数,awk默认用空格分列。
模式负责内容的过滤和查找,动作负责挑选
{}中的print代表输出的意思。$代表去列
$1就是取第一列,以此类推...
awk -F “:” ‘{print $1}’ yunjisuan.txt
输出以冒号为分隔符的第一列
$0默认输出所有内容
$NF默认是取最后一列(默认取最后一组元素)
二.awk的使用格式
1.基础用法
awk 参数 ’模式 动作‘
先进行参数筛选,再进行模式,再进行动作
有大括号就是动作,如果写内容就执行
如果有大括号不输入动作内容(空的大括号):就不输出内容
不添加大括号就默认全输出
2.正则用法
awk -F “[:/ ]” 指定多个分隔符
ifconfig eth0 | awk ‘NR==2’ | awk -F “[ ]+” ‘{print $2}’
如果不加+ 前面的空格一个一个取,需要取很多次,为了方便,后面还是要加+
默认不加[ ],默认的空格是贪婪的,自动去掉左右空格。
3.多个模式和动作
awk -F “:” ‘NR==1{print NR,$1}NR==2{print NR,$NF}’ /etc/passwd
命令说明:这里有多个条件和动作的组合
NR=1表示条件,行号(NR)等于1的条件满足的时候,执行相应的动作。
NR=2表示条件,行号(NR)等于2的条件满足的时候,执行相应的动作。
这个模式每行可以取不一样
4. awk的原理
一行一行的读数据,读完一行后看模式和条件,看看是否符合模式?
如果符合,就执行动作了;
如果不符合就继续读下一行。
所有都结束到结尾了,会触发一个END模块
在模式和动作之前还有一个BEGIN的模块
三.awk的大致框架(忘了看这里!):
先由-F “[ :]”进行分列;$2~//进行筛选内容;最后由print进行输出想要的结果
1.开始模块和结束模块
awk -F 参数 ‘BEGIN{}模式{动作}END{}’
先通过模式来找到范围,再通过动作来切割成一列一列的;
开始模块是告诉awk数据要如何读,结束模块是要告诉awk程序要如何结束。
2.读入换行符和输出换行符概述
NR这个符号其实不是行号,而是读到 就算作一段,恰好就等于行号了
awk默认是读到 算做一段
我们是可以修改awk这个一默认值的,不让 作为结尾
读入换行符:修改awk默认读数据时候的默认换行符
输出换行符:
3.开始模块和结束模块
我们可以通过BEGIN模块,在awk怎样读取数据
默认awk读入换行符和输出换行符都是
awk ‘BEGIN{RS=”:”}{print $0}’ yunjisuan.txt
RS参数(输入换行符):BEGIN{RS=”:”} 以冒号作为行的输入结束来表示
ORS参数(输出换行符):BEGIN{ORS=”|”} 以|作为行的输出结束来表示
由于我们设定读入换行符RS=“:”,就以:为结尾变成一行,到结尾时,输出换行符是还是 ,所以最后输出时, :又被换成 替换成换行符,进行换行。
awk ‘BIGIN{RS=”:”;ORS=”|”}{print NR,$0}’
以:作为输入换行符,以|作为输出换行符,NR显示行号
四.统计命令sort.uniq和tr替换命令
sed -r ‘s/[^a-zA-Z]/ /g’ /etc/passwd
把所有字母以外得东西替换成空格
然后把内容重定向到一个文件中
cat test.txt | xargs -n1 | sort | uniq -c | sort -rn | head
xargs -n1 把每个元素排成一行
sort:默认什么都不加,以26字母顺序排序
uniq:相同的单词去重
uniq -c:去重复之前进行计数
sort -r:倒序
sort -n:按数字从小到大排序
sort -k2:按第二列排
tr: echo “1:2:3:4:5” | tr “:” “+”
把冒号替换成加号
五.进阶@awk模式和动作
最基本的4种模式
·正则表达式作为模式
·比较表达式作为模式
·范围模式
·特殊模式BEGIN和END
1.正则表达式作为模式
过滤出第九列中,所有以200开头结尾的那一行,看第一组(默认空格分组)
awk ‘$9~/^200$/{print $1}’ access.log
awk ‘$9~/^200$/{print $1}’ access.log | sort | uniq -c
假如输出的结果有很多,用sort和uniq-c进行排序和去重计数。
精确查找第九列中,所有名叫404的那一行,看第一组(默认空格分组)
awk ‘$9==”404”{print $1}’ access.log
解析命令:
以第9列作为模式,针对第9列进行正则匹配;
~波折号作为正则匹配操作符,!~是正则取反
//代表要输入正则;含有内容的
^200$以200以开头以200结尾
正则模式练习
2. 比较表达式作为模式
NR>=
3.范围表达式作为模式
//,//
从哪到哪
‘$5~//,//’
从第五行开始正则,然后从哪到哪
3. BEGIN模式和END模式
awk ‘BEGIN{print “AAA”,”BBB”}’
可以直接输出的东西,可以用来做表头
awk -F “:” ‘BEGIN{print “AAA”,”BBB”}{print $1,$3}’ yun.txt
以:作为分割,只输出1组和3组,表头输入内容
awk -F “:” ‘BEGIN{print “AAA”,”BBB”}{print $1,$3}END{print “xxxx”}’ yun.txt
BEGIN输出内容
END也可以输出内容
输出内容可以直接进行计算
awk ‘BEGIN{print 10/3}’
变量进行赋值并进行变量计算
awk ‘BEGIN{a=1;b=2;print a,b,a+b}’
注:赋值字母或符号时,需要加双引号,如a=”xxx”
5.awk过滤#显示行数#
awk ‘/^$/ {print $0}’ yun.txt | wc-l
awk ‘/^$/{i=i+1}’ yun.txt
解析:i=i+1 执行一次,自身加一;(i默认是0)
改变i的默认:{i=1;i=i+1}
awk ‘/^$/{i=i+1;print i}’ yun.txt
因为awk是一条一条得在执行,所以,print输出的是一个过程
awk ‘/^$/{i=i+1}END{print i}’ yun.txt
直接输出结果,在END后面
用awk看一共有多少行
awk ‘{i=i+1}END{print i}’ test
求里面所有的数据之和
awk ‘{i=i+$0}END{print i}’ test
i=i+$0原理:当awk读到第一行的时候,i初始值是0,$0是1;所以i=i+1是i=0+1这时候i=1;第二次的时候i=1+2;i=3;以此类推....
六.awk数组
1.数组的概述
假如我们想用一组变量来表示多组数据,通常我们优先考虑数组的形式。
例如:变量名[数字]=不同的值
如果我们只知道酒店名称,那么我们只能找到房间号;要想找到房间里具体的人,我们必须同时知道酒店名+房间号才可以。
2.变量取值
for (hotel in chensiqihotel)
新建的变量hotel,在chensijihotel里一遍一遍的循环取值,直到取完所有的值。
awk -F “[/ ]+” ‘{benchi[$2]=benchi[$2]+1}END{for(i in benchi)print i,benchi[i]}’ test
benchi从$2里取值,然后对$2进行计数;i从benchi里取值,最后输出i和benchi[i]统计数值