linux awk

2018/10/29  21:07:38

                                                                         linux—awk 简介

awk不仅仅是linux系统中的一个命令,而且是一种编程语言。可以用来处理数据和生成报告(excel)处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入。awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用。Awk -F 

_F;是指awk按照什么标准进行文件的切割,切割成一列一列的。

 

awk有参数-F可以指定awk按照什么符号切割文件内容,将源文件内容切割成一列一列的。

 

awk [options] pattern {action} file

 

Awk 格式  options参数 pattern模式 {action}动作

 

一部分模式 一部分动作 {}里的是动作 {}外的是模式

 

模式是条件 根据条件来筛选数据 先有模式再有动作 模式过滤完后在动作

 

如果我们不指定-F参数 awk默认按照  空格进行文本的切割{}

中的print代表输出的意思。 print打印

:输出以冒号分割符的第一列

$0;默认输出全部内容(取文件的全部内容)

$NF;默认取每行的最后一列

Awk -F : ‘NR>3 && NR<8 {print $0}yunjisuan.txt

 

1、根据参数(-F)先切割

 

2、根据‘单引号的模式进行内容过滤

3、符合模式条件的在进行动作输出

 

 冒号:七行

 

第6 5 4 3 2 1 

 

加[]和加号+  【】+

 [:/ ]+

基本模式;

Awk -F “:”  ‘NR>=2  && NR<=6 {print  NR,$1}’  /etc/passwd

命令说明;

F 指定分隔符为冒号,相当于以“:”为菜刀,进行字段的切割。 NR>=2 && NR<=6;这部分表示模式,是一个条件,表示取第2行到第六行。 {print NR,$1};这部分表示动作,表示要输出NR行号和$1第一列。

只有模式

命令说明;

-F指定分割符为冒号

NR>=2&&<=6这部分条件,表示取第二行到第6行

但是这里没有动作,这里大家需要了解如果只有条件(模式)没有动作,awk默认整行。

只有动作

多个模式和动作

 -F指定分割符号为冒号

这里有多个条件与动作的组合

NR==1表示条件,行号(NR)等于1的条件满足的时候,执行{print NR,$1}动作,输出行号与第一列

NR==2表示条件,行号早(NR)等于2的条件满足的时候,执行{print NR,$NF}动作,输出行号与最后一列($N

awk 执行过程

怎么处理文件

过程演示

 命令说明;

条件NR>=2,表示行号大于等于2时候,执行{print $0}显示整行

awk是通过一行一行的处理文件,这条命令中包含模式部分(条件)和动作部分(动作),awk将处理模式(条件)指定的行

awk -F 参数 ‘BEGIN模块{}模式{动作}END模块{}’后面加文件名 也就是AWK有两个模块一个开始一个结尾。

 记录和字段,为了方便理解可以把记录就当行即记录==行,字段相当于列,字段==列

awk输出是它以什么符号输出就以什么符号换行。

模式和动作都不输出代表全部默认输出。

以冒号不默认输出而换行

 

 读入换行符

输入换行符修改了输出换行符 分割符号ORS

除了字母全部换掉

打开文件

变成一行

   xargs -NL变成竖行

排序sort 

uniq所有相同的单词取消定重

 

Uniq -c 表示去重还显示行数

Sort -n 让它按着数字排列 sort是默认输出26个字母

sort -rn 逆转排序

sort -k2  参数     -r  -n  -k  k2 指定列排序

 

awk 进阶

模式与动作

1、正则表达式作为模式

显示第9行是正则表达式的IP地址

awk '$9~/^200$/' test

awk '$9~/^200$/{print $1}'  test

2、比较模式

NR>=3&&<=8

取出文件/etc/services的10-20行

awk 'NR>=10&&NR<=20' /etc/services

awk 'NR>10&&NR<20' /etc/services

 判断某一列是否等于某个字符,找出/etc/passwd中第五列是root的行

# awk -F":" '$5=="root"' rver/files/awk_equal.txt

# awk -F":" '$5~/^root$/' rver/files/awk_equal.txt

 

找出工资在(40000,60000)之间的员工名字

# awk -F: ‘$3>=”40000” && $3<=”60000” {print $1}’ test2

  

范围模式

显示第二行到第五行的行好和整行的内容

# awk 'NR==2,NR==5{print NR,$0}' count.txt

 

显示以bin开头,到第五行的行号及整行内容

# awk '/^bin/,NR==5{print NR,$0}' awkfile.txt

 

从第三列以bin开始的行到以lp开头的行并显示其行号和整行内容

awk -F":" '$5~/^bin/,/^lp/{print NR,$0}' awkfile.txt

 

从第三列以bin开头字符串的行到第三列以lp开头字符串的行

# awk -F: '$5~/^bin/,$5~/^lp/{print NR,$0}' awkfile.txt
特殊模式
 BEGIN模块

(1)定义内置变量(-F本质式修改的FS变量)

# ifconfig eth0|awk -F "(addr:)|( Bcast:)" 'NR==2{print $2}'

相当于# ifconfig eth0 | awk 'BEGIN{FS="(addr:)|( Bcast:)"} NR==2{print $2}'

 

# ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'

相当于# ifconfig eth0 | awk 'BEGIN{FS="[ :]+"}NR==2{print $4}'

 

# ifconfig eth0 | awk -F "[^0-9.]+" 'NR==2{print $2}'

相当于# ifconfig eth0 | awk 'BEGIN{FS="[^0-9.]+"}NR==2{print $2}'

 

(2)在读取文件之前,输出提示性信息(表头)

# awk -F ":" 'BEGIN{print "1111","2222"} {print $1,$3} ' test.txt

 

# awk -F ":" 'BEGIN{print "1111","2222"} {print $1,$3} END{print "asdf","asdfg"}' test.txt

 

(3)使用BEGIN 模块的特殊性质,进行一些测试(计算)

计算数值

# awk 'BEGIN{print 10/3}'

 

赋值变量

# awk 'BEGIN{a=1;b=2;print a,b,a+b}'

  

awk中字母会被认为是变量,给一个变量赋值字母(字符串),用双引号

# awk 'BEGIN{abcd=123456;a=abcd;print a}'

123456

 

# awk 'BEGIN{a="abcd";print a}'

abcd

 

表示a的b次方

# awk ‘BEGIN{a=2;b=3;print a**b}’

 

查看/etc/services空行个数

 方法一:

# grep -c “^$” /etc/services   

方法二:

# awk ‘/^$/ {i=i+1} END{print i}’ /etc/services

 其中,i=i+1 等同于i++

 

查看test文件一共有多少行 

# awk ‘{i++}END{print i}’ test

 

求test文件每行的值之和

# awk ‘{i=i+$0}END{print i}’ test

 

求 test文件每行的值之积(BEGIN初始变量设定位置)

# awk ‘BEGIN{i=1}{i=i*$1}END{print i}’ test

 

awk数组

用一个变量表示多组数据,通常优先考虑数组,eg:变量名[数字]=不同的值

awk数组结构

arrayname[string]=value

arrayname为数组名

string为元素名

value为值

 

循环语句

for(变量1 in 变量2) 表示变量1在变量2 中取值,变量1被变量2循环赋值

  

统计域名访问次数

(1)取出域名

(2)将域名去重

(3)统计次数

方法一:

# awk -F “/+” ‘{print $2}’ wangxiong | sort uniq -c

方法二:

# awk -F "[ /]+" '{h[$2]++}END{for(i in h)print i,h[i]}' wangxiong

 

统计域名访问次数并累计流量

(1)取出域名

(2)将域名去重

(3)统计流量大小

#  awk -F "[ /]+" '{h[$2]=h[$2]+$4}END{for(i in h)print i,h[i]}' wangxiong

 

第一列字母去重,并求和

# awk ‘{h[$1]+$2}END{for(i in h)print i,h[i]}’ test
企业面试题;取出网卡echo的IP地址
方法1、hostname -I
方法2、ifconfig ech0 | awk -F "[   :]+"   'NR==2{print $4}'
方法3、ifconfig ech0 | awk 'BEGIN{RS="[   :]"}NR==31'
方法4、ifconfig eth0 | awk -F "[   :]+"  'NR==2{print NR,$3}'
 
 


  




 

    

原文地址:https://www.cnblogs.com/jijiguowang/p/9873289.html