awk

一.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.uniqtr替换命令

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:按第二列排

trecho “1:2:3:4:5” | tr “:” “+” 

把冒号替换成加号

五.进阶@awk模式和动作

最基本的4种模式

·正则表达式作为模式

·比较表达式作为模式

·范围模式

·特殊模式BEGINEND

1.正则表达式作为模式

过滤出第九列中,所有以200开头结尾的那一行,看第一组(默认空格分组)

awk ‘$9~/^200$/{print $1}’ access.log

awk ‘$9~/^200$/{print $1}’ access.log | sort | uniq -c

假如输出的结果有很多,用sortuniq-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$01;所以i=i+1i=0+1这时候i=1;第二次的时候i=1+2i=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进行计数;ibenchi里取值,最后输出ibenchi[i]统计数值

原文地址:https://www.cnblogs.com/kakajiang/p/9871999.html