码迷,mamicode.com
首页 > 其他好文 > 详细

十五 awk文本处理

时间:2018-05-05 21:14:23      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:文件中   关键字   etc   打印   逻辑   RoCE   alt   引擎   图片   

 

 

awk编程语言/数据处理引擎

 

 

 

创造者:Aho、Weinberger、Kernighan
基于模式匹配检查输入文本,逐行处理并输出
通常用在Shell脚本中,获得指定的数据
单独用时,可对文本数据做统计

 

 

基本用法

 

 

语法格式

 

 

前置命令 | awk [选项] ‘[条件]{编辑指令}‘
awk [选项] ‘[条件]{编辑指令}‘ 文件
在编辑指令中,若有多条语句,可用分号分隔,print是最常用的指令

 

常用命令选项

 

命令选项    注释
-F    指定分隔符,可省略(默认空格或Tab位);符号分隔需要用双引号""括起来
-f    调用awk脚本进行处理
-v    调用外部Shell变量

 

技术分享图片

 

 处理动作

 

 

print     打印,相当于shell中的echo
,      多个参数用逗号分隔
;      多个动作用分号;分隔

 

awk执行过程

 

以行为处理单位
对数据进行逐行处理
处理完当前行,把当前行的处理结果输出后自动对下一行进行处理 直到文件中所有行处理完为止

 

awk内置变量

 

直接含义,可直接使用

调用变量的时候不用$符号标示,直接调用就可以

 

 

 

变量        用途
FILENAME     当前处理文件的文件名
$0         当前读入的整行文本内容
NR         记录当前已读入行的数量(行数)
FNR        保存当前处理行在原文本内的序号(行号)
NF         记录当前处理行的字段个数(列数)
$n        指定分隔的第n个字段,如$1、$3分别表示第1、第3列
FS        保存或设置字段分隔符,例如FS=":"
ENVIRON     调用Shell环境变量,格式为:ENVIRON["变量名"]

 

 

 

awk处理时机

 

BEGIN{}:行前处理      读入第一行文本之前执行;一般用来初始化操作
                可选操作,可以有多个
{ }:逐行处理          逐行读入文本执行相应的处理;可选操作
                是最常见的编辑指令块
END{}:行后处理        处理完最后一行文本之后执行;可选项
               一般用来输出处理结果

 

注意:可单独使用,也可同时使用

 

例子: awk‘BEGIN{FS=":";print NR} {print NR,$0}END{print NR}‘   a.txt

 

 

技术分享图片

 

 

 awk处理条件

 

 

默认awk对读入的每行进行处理,如想只处理指定行时就需要加要条件判断。

awk [选项] ‘[条件]{处理动作}‘ 文件

 

条件的表现形式

 

正则表达式
数值或字符串比较
逻辑比较
运算符

 

使用正则条件

 

~匹配:结果匹配正则表达式为真
!~不匹配:结果不匹配正则表达式为真

 

 

技术分享图片

 

 使用数值比较

 

 

操作符    含义
==    等于;用于字符比较时要加 "" 双引号 
!=    不等于;用于字符比较时要加 "" 双引号
>     大于
>=    大于或等于
<     小于
<=    小于或等于

 

 技术分享图片

 

技术分享图片

 

逻辑比较

 

操作符    
&&逻辑与    期望多个条件都成立
||逻辑或    只要有一个条件成立即满足要求

 

技术分享图片

 

 

 

变量的运算

运算符
+、-、*、/、%
++、--、+=、-=、*=、/=
^或**(乘方)

 

技术分享图片

 

 

技术分享图片

 

技术分享图片

 

 

 

awk流程控制

 

awk流程控制分类

 

分支结构

 

单分支
双分支
多分支

 

 

 

循环结构

 

while 
do...while
for

 

 

 

 

 

 分支结构

 

 

 

单分支

 

if(条件){编辑指令}

 

例子

 

 awk -F ":" {if($3==1){print $0;print NR}} /etc/passwd

 

 

 

双分支

 

 

 

if(条件){编辑指令1}else{编辑指令2}

 

 

 

 

例子

 

awk -F":"   { if($3<500){i++}else{j++} }END{print i;print j  }  /etc/passwd

 

 

多分支

 

if(条件){编辑指令1}else{编辑指令2}....else{编辑指令N}

 

技术分享图片

 

 while循环结构

 

 

while循环

 

while (条件){编辑指令}

 

do while循环

 

do{编辑指令}while(条件)

 

技术分享图片

 

 

for循环结构

 

for循环

 

 

for(初值;条件;步长){编辑指令}

 

 

 

例题:

 

awk BEGIN{for(i=0;i<=10;i++){print i}}

 

 

 

主要的控制语句

 

 

关键字    含义
break    结束当前的循环体
continue    中止本次循环,转入下一次循环
next    跳过当前行,读入下一行文本开始处理
exit    结束文本读入,转入END{}执行
    如果没有END{}则直接退出awk处理操作

 

 

 

 

 

技术分享图片

 

 

 

用awk脚本处理文件
[root@localhost ~]# cat test.awk 
#!/bin/awk -f
BEGIN{
FS=":"
i=0
j=0
}

{
   if($3<500){
     i++

}else{
    j++
}
}

END{
print "系统内建用户有 " i ""
print "系统外建用户有 " j ""
}



例题:
awk -F":" { while($3<3){print $1,$3;$3++} } /etc/passwd 
awk -F":" {while($3<3){print $1,$3;$3=3}} /etc/passwd

awk BEGIN{ i=1;while(i<=10){if(i%2==0){print i};i++} }

awk BEGIN{i=0}{i++}END{print i} /etc/passwd

用awk统计文件数据

vim testa.awk
#!/bin/awk -f
BEGIN{
FS=":"
i=0
j=0
}

{
if($3<500){
        i++
}else{
        j++
}
 }

END{
print i
print j

}

 

 

 awk数组

 

定义数组

 

数组名[数组元素下标]=元素值

 

输出数组元素print

 

数组名[数组元素下标]

 

如:

awk -F ":" {usergrp[$3]=$1;print usergrp[$3]} /etc/passwd
    awk BEGIN{usergrp[0]="yzs";usergrp[1]="lucy";print usergrp[0]}

 

 

遍历(输出)数组的循环结构:

 

 

for(变量名 in  数组名){print 数组名[变量]}

 

 

 

 

例子:

 

awk BEGIN{usergrp[0]="yzs";usergrp[1]="lucy";for( i in usergrp){print usergrp[i]}}

        awk BEGIN{ for(i=1;i<=10;i++){name[i]=i};for(j in name){print name[j]}  }

 

 

 

 

数组作业

把当前系统使用频率最高的前10条命令输出

 

 

awk  { comm[$1]++}END{for( i  in  comm){print  i,comm[i]}}  /root/.bash_history   |  sort  -rnk   2   |   head

 

 

其中各个命令的含义:

 

comm[$1]++} :$1是文件中的第一列  ++ 当第一列数据相同时自加1
END{for( i  in  comm)  
{print  i,comm[i]}} 
 /root/.bash_history  
|  sort  -rnk   2   
|   head

 

 

 

 

2 、输出当前系统1小时内占用CPU最多的前10个进程

 

#!/bin/bash
for((i=0;i<60;i++))
do
    ps   -eo   comm,pcpu  |  tail   -n   +2   >>  /tmp/top10.txt
    sleep  60
done
awk { process[$1]+=$2}END{for(  j   in  process){ print  i,process[i]}}  /tmp/top10.txt   |  sort  -rnk    2  | head

 

 

 

 

 

awk练习题:

 

1、只显示uid是501的用户的详细信息
awk -F ":" $3=="501"{print $0} /etc/passwd



2、输出文件中偶数行的内容
awk FNR%2!=1{print $0} a.txt 


3、统计系统内有多少个用户不能登录系统
 awk -F ":" $7~"no"{print $0;i++}END{print i} /etc/passwd

41-100间 是7的倍数或是含7的数显示出来
awk FNR%7==0{print $0}{print FNR} /etc/passwd



5、统计当前系统有多少个内建帐户


6、统计当前系统有多少个自定义帐户
awk -F ":" BEGIN{i=0;j=0}$3<500{i++}$3>=500{j++}END{print "uid 小于 500的用户有 "i"个";print "uid 大于等于 500的用户有"j"个"}  /etc/passwd

7、把用户名含数字的用户信息输出
awk -F ":" $1~/[0-9]/{print $0} aa.txt

8、显示前5个系统用户的用户名、uid、shell

 

十五 awk文本处理

标签:文件中   关键字   etc   打印   逻辑   RoCE   alt   引擎   图片   

原文地址:https://www.cnblogs.com/zhongguiyao/p/8996074.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!