十五 awk文本处理

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脚本处理文件
[[email protected] ~]# 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

4、1-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

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

时间: 2024-10-18 07:12:43

十五 awk文本处理的相关文章

第十五章 文本样式(上)

第 15章 CSS文本样式[上]学习要点:1.字体总汇2.字体设置3.Web字体 本章主要探讨 HTML5中 CSS文本样式,通过文本样式的设置,更改字体的大小.样式以及文本的方位.一.字体总汇本节课,我们重点了解一下 CSS文本样式中字体的一些设置方法,样式表如下:属性名 说明font-size 设置字体的大小font-variant 设置英文字体是否转换为小型大写font-style 设置字体是否倾斜font-weight 设置字体是否加粗font-family 设置 font字体font

解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)

解剖SQLSERVER 第十五篇  SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-source-for-stored-procedures/ 目前我正在扩展OrcaMDF Studio的功能 不单只支持系统表,DMVs 和用户表 而且也要支持存储过程.那很容易,我们只需要查询sys.procedures --或者查询sys.sysschobjs, 因为当SQLSERVER没有在运行的时候我

第十九章 文本处理流编辑器:awk编程

第十九章 文本处理流编辑器:awk编程 名词解释 awk 是一种编程语言,用于linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件.或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大个编程工具.它在命令行中使用,但更多是作为脚本来使用.awk有很多内建的功能,比如:数组.函数等,这是它和C语言的相同之处,灵活性是awk最大的优势. awk命令格式和选项 语法形式 awk [option] 'script'

Linux系统管理之十五---shell

一.shell基础1.shell的基本概念shell就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.用户界面shell(还有其他用户界面如kde等图形界面)-->内核-->硬件. 2.shell的种类/bin/sh/bin/bash  默认shell/bin/ksh   兼容bash/bin/tcsh  c shell/bin/csh   已被tcsh替代,c shell可以在/etc/shells文件中查看有哪些shell种类, 以下我们要学的都是bash这个shell的知识

第十五章 shell正则表达式

第十五章 shell正则表达式 见图片 Shell正则表达式 正则表达式的分类 基本的正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs) 扩展的正则表达式(Extended Regular Expression 又叫Extended RegEx 简称EREs) Perl的正则表达式(Perl Regular Expression 又叫Perl RegEx 简称PREs) 基本组成部分 正则表达式的基本组成部分. 正则表达式 描述 示例 Bas

第十五篇 Integration Services:SSIS参数

本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到SSIS 2012.在这一篇,我们将探讨SSIS变量的姊妹:SSIS参数.我们将展示参数配置,通过包参数管理动态属性值,以及在SSIS包执行期间参数是如何配置和使用的.首先在SSDT-BI打开转换过的My_First_SSIS_Project,如图15.1所示:图15.1My_First_SSIS_P

C和指针 (pointers on C)——第十五章:输入输出函数

第十五章 输入输出函数 这一章读完的第一感觉就是"呵呵". 如果说上过C语言课,基本上scanf()/printf()算是用的比较熟练了.尤其是那些抽象的格式说明.还有scanf()为什么要加括号. 读过本书前面的内容的话,getchar(),putchar(),gets(),puts()这些应该也问题不大. 再如果的话,你学过计算机图形学,你玩过OpenGL,听说过双缓存机制,那么fflush()也肯定弄明白了. 再加上FILE的操作,输入输出定位刷新删除改名,流的概念. 这一章就会

QT开发(六十五)——QT样式表编程实例

QT开发(六十五)--QT样式表编程实例 一.QComboBox组合框样式定制 1.基本定义 QComboBox  {     border: 1px solid gray;     border-radius: 3px;     padding: 1px 2px 1px 2px;  # 针对于组合框中的文本内容     min-width: 9em;   # 组合框的最小宽度 } QComboBox::drop-down {     subcontrol-origin: padding;   

第十五周进度条

第十五周          日期  星期一   星期二   星期三   星期四   星期五   星期六   星期日  了解到的知识点   分页分为真分页和加分页:假分页是先将所需要的数据全部查询出来(坏处是第一次很慢好处是点击下一页会很快)真分页是只查询需要的那几条(比如select * from table limit(0,5))(每次运行时间一样) jsp进入页面鼠标落到指定文本框 function setfocus(){   UserName.focus();} <body ><i