awk也是用来处理文本的,awk语言可以从文件或字符串中基于指定规则浏览和抽取信息,可以实现数据查找、抽取文件中的数据、创建管道流命令等功能。

awk模式匹配

第一种方法打印空白行
将空白行打印出来,并输出this is a blank line.(有几行空白行就打印几行this is a blank line.)
awk '/^$/{print "this is a blank line."}' dim_ia_test.log

第二种方法调用awk打印空白行

cat scr.awk

  1. /^$/{print "this is a blank line."}

执行命令:

awk -f scr.awk dim_ia_test.log

命令结果:

第三种方法打印空白行

cat scr1.awk

  1. #!/bin/awk -f
  2. /^$/{print "this is a blank line."}

将执行权限赋予脚本:chmod u+x scr1.awk

执行命令:

./scr1.awk dim_ia_test.log  

执行结果:

awk之记录和域

将第二列、第一列、第四列、第三列打印出来(默认以空格分割)
awk '{print $2,$1,$4,$3}' dim_ia_test2.log
将全部列都打印出来(默认以空格分割)
awk '{print $0}' dim_ia_test2.log
将第三列内容打印出来(默认以空格分割)
awk 'BEGIN {one=1;two=2}{print $(one+two)}' dim_ia_test2.log
等价
awk '{print $3}' dim_ia_test2.log
-F为改变分隔符为-,将第三列内容打印出来
awk -F"\-" '{print $3}' dim_ia_test2.log

awk之关系和布尔运算
awk关系运算符及其意义
< --小于
> --大于
<= --小于等于
>= --大于等于
== --等于
!= --不等于
~ --匹配正则表达式
!~ --不匹配正则表达式
匹配以:分割的第一个域是否含有Job,如果含有Job,则打印该行
awk 'BEGIN {FS=":"} $1~/Job/' dim_ia_test.log
全部域匹配05,并将含有05的行打印出来
awk 'BEGIN {FS=":"} $0~/05/' dim_ia_test.log
以:分割,如果满足第一个域小于第二个域,则打印该行的全部域
awk 'BEGIN {FS=":"}{if($1<$2) print $0}' dim_ia_test.log
 
awk布尔运算符及其意义
|| --逻辑或
&& --逻辑与
! --逻辑非
多条件精确匹配,以:分割,如果满足第一个域小于第二个域或者第二个域大于第三个域,则打印该行的全部域
awk 'BEGIN {FS=":"}{if($1<$2||$2>$3) print $0}' dim_ia_test.log
多条件模糊匹配,以:分割,如果满足第一个域含有数字3或者第二个域含有数字3,则打印该行的全部域
awk 'BEGIN {FS=":"}{if($1~3||$2~3) print $0}' dim_ia_test.log
 
awk之表达式
awk算术运算符及其意义
+ --加
- --减
* --乘
/ --除
% --模
^或** --乘方
++x --在返回x值之前,x变量加1
x++ --在返回x值之后,x变量加1
统计空白行,并以1,2,3,4………的形式打印出来
awk '/^$/{print x+=1}' dim_ia_test.log
统计空白行,并以0,1,2……的形式打印出来
awk '/^$/{print x++}' dim_ia_test.log
统计空白行,并以1,2……的形式打印出来
awk '/^$/{print ++x}' dim_ia_test.log
结果呈现:
 
 计算平均值的一个例子:
cat sturecord  --数据源
  1. li ming,68,75,89,90
  2. fang tianyi,60,90,70,80
  3. fang xiaolong,81,72,64,95
  4. fang tianxin,80,70,69,95

cat scr2.awk  --awk脚本

  1. #!/bin/awk -f
  2. BEGIN {FS=","}
  3. {total=$2+$3+$4+$5
  4. avg=total/4
  5. print $1,total,avg}

赋给脚本执行权限

chmod u+x scr2.awk

执行脚本

./scr2.awk sturecord  

执行结果:

  1. li ming 322 80.5
  2. fang tianyi 300 75
  3. fang xiaolong 312 78
  4. fang tianxin 314 78.5

  

awk之系统变量
awk环境变量及其意义
$n --当前记录的第n个域,域间由FS分隔
$0 --记录的所有域
ARGC --命令行参数的数量
ARGIND --命令行中当前文件的位置(以0开始标号)
ARGV --命令行参数的数组
CONVFMT --数字转换格式
ENVIRON --环境变量关联数组
ERRNO --最后一个系统错误的描述
FIELDWIDTHS --字段宽度列表,以空格键分隔
FILENAME --当前文件名
FNR --浏览文件的记录数
FS --字段分隔符,默认是空格键
IGNORECASE --布尔变量,如果是真,则进行忽略大小写的匹配
NF --当前记录中的域数量
NR --当前记录数
OFMT --数字的输出格式
OFS --输出域分隔符,默认是空格键
ORS --输出记录分隔符,默认是换行符
RLENGHT --由math函数所匹配的字符串长度
RS --记录分隔符,默认是空格键
RSTART --由math函数所匹配的字符串的第一个位置
SUBSEP --数组下标分隔符,默认值是\034
以,号分隔,输出记录中的域数量,当前记录数,以及记录的所有域
awk 'BEGIN {FS=","} {print NF,NR,$0} ' sturecord

  1. 5 1 li ming,68,75,89,90
  2. 5 2 fang tianyi,60,90,70,80
  3. 5 3 fang xiaolong,81,72,64,95
  4. 5 4 fang tianxin,80,70,69,95

以,号分隔,输出记录中的域数量,当前记录数,以及记录的所有域,最后输出当前文件名

awk 'BEGIN {FS=","} {print NF,NR,$0} END {print FILENAME}' sturecord

  1. 5 1 li ming,68,75,89,90
  2. 5 2 fang tianyi,60,90,70,80
  3. 5 3 fang xiaolong,81,72,64,95
  4. 5 4 fang tianxin,80,70,69,95
  5. sturecord

  

awk之格式化输出
printf修饰符及其意义
- --左对齐
width --域的步长
.prec --小数点右边的位数
printf格式符及其意义
%c --ASCII字符
%d --整数型
%e --浮点数,科学记数法
%f --浮点数
%o --八进制数
%s --字符串
%x --十六进制数
以,号分隔,格式化输出第一列(字符串格式)、第二列(整型),第一列与第二列之间以tab间分隔,每行打印完即回车
awk 'BEGIN {FS=","} {printf("%s\t%d\n",$1,$2)}' sturecord
  1. li ming 68
  2. fang tianyi 60
  3. fang xiaolong 81
  4. fang tianxin 80
以,号分隔,格式化输出第一列(字符串格式)、第二列(浮点型),第一列与第二列之间以tab间分隔,每行打印完即回车
awk 'BEGIN {FS=","} {printf("%s\t%f\n",$1,$2)}' sturecord
  1. li ming 68.800000
  2. fang tianyi 60.600000
  3. fang xiaolong 81.300000
  4. fang tianxin 80.600000

将65转换为ASCII字符
awk 'BEGIN {printf("%c\n",65)}'

  1. A

以,号分隔,格式化输出第一列(字符串格式)、第二列(整型),这里第一列做了一个处理,-15表示该字符串长度控制在15位,并且左对齐,若字符串不足15位则用空格补全,第一列与第二列之间以tab间分隔,每行打印完即回车
awk 'BEGIN {FS=","} {printf("%-15s\t%f\n",$1,$2)}' sturecord

  1. li ming 68.800000
  2. fang tianyi 60.600000
  3. fang xiaolong 81.300000
  4. fang tianxin 80.600000

以,号分隔,格式化输出第一列(字符串格式)、第二列(整型),我们在输出域上加了解释语言,第一列做了一个处理,-15表示该字符串长度控制在15位,并且左对齐,若字符串不足15位则用空格补全,第一列与第二列之间以tab间分隔,每行打印完即回车
awk 'BEGIN {FS=",";print "NAME\t\tMATHSCORE"} {printf("%-15s\t%f\n",$1,$2)}' sturecord

  1. NAME MATHSCORE
  2. li ming 68.800000
  3. fang tianyi 60.600000
  4. fang xiaolong 81.300000
  5. fang tianxin 80.600000

以,号分隔,格式化输出第一列(字符串格式)、第二列(浮点型,浮点型保留一位小数),第一列与第二列之间以tab间分隔,每行打印完即回车
awk 'BEGIN {FS=","} {printf("%s\t%.1f\n",$1,$2)}' sturecord

  1. li ming 68.8
  2. fang tianyi 60.6
  3. fang xiaolong 81.3
  4. fang tianxin 80.6

以,号分隔,格式化输出第一列(字符串格式)、第二列(浮点型,浮点型保留两位小数),第一列与第二列之间以tab间分隔,每行打印完即回车
awk 'BEGIN {FS=","} {printf("%s\t%.2f\n",$1,$2)}' sturecord

  1. li ming 68.80
  2. fang tianyi 60.60
  3. fang xiaolong 81.30
  4. fang tianxin 80.60

以,号分隔,格式化输出第一列(字符串格式)、第二列(浮点型,浮点型保留两位小数,该浮点数长度控制在10位,且为右对齐),第一列与第二列之间以tab间分隔,每行打印完即回车
awk 'BEGIN {FS=","} {printf("%s\t%10.2f\n",$1,$2)}' sturecord

  1. li ming 68.80
  2. fang tianyi 60.60
  3. fang xiaolong 81.30
  4. fang tianxin 80.60

总结printf修饰符的一版形式:%-width.prec格式控制符

awk之内置字符串函数
awk字符串函数及其意义
gsub(r,s) --在输入文件中用s替换r
gsub(r,s,t) --在t中用s替换r
index(s,t) --返回s中字符串第一个t的位置
length(s) --返回s的长度
match(s,t) --测试s是否包含匹配t的字符串
split(r,s,t) --在t上将r分成序列s
sub(r,s,t) --将t中第一次出现的r替换为s
substr(r,s) --返回字符串r中从s开始的后缀部分
substr(r,s,t) --返回字符串r中从s开始长度为t的后缀部分
首先指定域分隔符为",",输出的域分隔符为":",然后将第一个域中的fang替换为yuan,最后输出全部域,将含有yuan的所有行显示出来
awk 'BEGIN {FS=",";OFS=":"} gsub(/fang/,"yuan",$1) {print $0}' sturecord

  1. yuan tianyi:60.6:90:70:80
  2. yuan xiaolong:81.3:72:64:95
  3. yuan tianxin:80.6:70:69:95

ph在gridsphere中第六位开始出现
awk 'BEGIN {print index("gridsphere","ph")}'

  1. 6

gridsphere的长度是10
awk 'BEGIN {print length("gridsphere")}'

  1. 10

测试D是否包含匹配字符串gridsphere,返回0为不包含
awk 'BEGIN {print match("gridsphere",/D/)}'

  1. 0

忽略大小写后,测试D是否包含匹配字符串gridsphere,返回4说明包含,d出现在第四个位置
awk 'BEGIN {IGNORECASE=1;print match("gridsphere",/D/)}'

  1. 4

先定义str变量,使用sub函数将第一次出现的pro定义成PRO
awk 'BEGIN {str="multiprocessor programming";sub(/pro/,"PRO",str);printf("%s\n",str)}'

  1. multiPROcessor programming

将sturecord中第一号域与fang匹配的记录中的第一次出现的60改成99
awk 'BEGIN {FS=","}{$1~fang sub(/80/,"99",$0);print $0}' sturecord

  1. li ming,68.8,75,89,90
  2. fang tianyi,60.6,90,70,99
  3. fang xiaolong,81.3,72,64,95
  4. fang tianxin,99.6,70,69,95

截取str从第六个字符开始的后缀部分
awk 'BEGIN {str="multiprocessor programming";print substr(str,6)}'

  1. processor programming

截取str从第六个字符开始的长度为9的后缀部分
awk 'BEGIN {str="multiprocessor programming";print substr(str,6,9)}'  

  1. processor

向awk脚本传递参数

cat pass.awk

  1. #!/bin/awk -f
  2. NF!=MAX
  3. {print ("The line "NR" does not have "MAX" filds.")}

赋权 chmod u+x pass.awk

执行命令:./pass.awk MAX=3 FS="," sturecord

  1. li ming,68.8,75,89,90
  2. The line 1 does not have 3 filds.
  3. fang tianyi,60.6,90,70,80
  4. The line 2 does not have 3 filds.
  5. fang xiaolong,81.3,72,64,95
  6. The line 3 does not have 3 filds.
  7. fang tianxin,80.6,70,69,95
  8. The line 4 does not have 3 filds.

输出sturecord的所有记录,每行记录前加上其行号,重新定义OFS的值,改变输出域的分隔符
awk 'BEGIN {FS=","} {print NR,$0}' OFS=";" sturecord

  1. 1;li ming,68.8,75,89,90
  2. 2;fang tianyi,60.6,90,70,80
  3. 3;fang xiaolong,81.3,72,64,95
  4. 4;fang tianxin,80.6,70,69,95

  

awk之条件语句和循环语句
条件语句if的语法
if(条件表达式)
  动作1
  [else
  动作2]
样例
awk 'BEGIN {if (x==y) print "x与y相等"}' x=1 ;y=1
 
三种循环
while(条件表达式)
    动作
 
do
  动作
while(条件表达式)
 
for(设置计数器初值;测试计数器;计数器变化)
   动作

awk之数组
将原始定义的数组打印出来
awk 'BEGIN{data[10.15]="1200";printf("<%s>\n",data[10.15])}'
关键字in用于判断元素10.15是否在数组中,如果存在,则输出found element!
awk 'BEGIN{data[10.15]="1200";if("10.15" in data) print "found element!"}'
将abc/def/lih分成3个元素存储在数组str中
awk 'BEGIN{print split("abc/def/lih",str,"/")}' 

  1. 3

将第一个域按空格拆分,存到name数组中
awk 'BEGIN{FS=","}{print split($1,name," ")}' sturecord

  1. 2
  2. 2
  3. 2
  4. 2

演示split所生成的数组

查看脚本:cat array.awk

  1. #!/bin/awk -f
  2. BEGIN {FS=","}
  3. {split($1,name," ");
  4. for(i in name) print name[i]}

赋权: chmod u+x array.awk

执行:./array.awk sturecord

  1. li
  2. ming
  3. fang
  4. tianyi
  5. fang
  6. xiaolong
  7. fang
  8. tianxin

等价于:awk 'BEGIN{FS=","}{split($1,name," ");for(i in name)print name[i]}' sturecord

awk编程的基本用法的更多相关文章

  1. shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计

    shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...

  2. 第4章 awk编程

    1 awk编程模型       2 awk用法 调用awk有三种方法(与sed类似): 在Shell命令行输入命令调用awk,格式为: awk [-F 域分隔符] 'awk程序段' 输入文件 将awk ...

  3. awk工具的基本用法

    awk文本过滤的基本用法 1)基本操作方法 格式:awk [选项] '[条件]{指令}' 文件 其中,print 是最常用的编辑指令:若有多条编辑指令,可用分号分隔. Awk过滤数据时支持仅打印某一列 ...

  4. awk下 gsub函数用法

     (2012-03-27 01:37:28) 标签: awk gsub linux 函数 it 分类: linux gsub函数则使得在所有正则表达式被匹配的时候都发生替换 gsub(regular ...

  5. AWK编程

    1.awk的概述 文本处理工具,由于功能的强大,也可以当做是一种数据操作语言,非常适合结构化数据的处理和格式化报表的生成,awk可以进行样式装入.流控制.数学运算符.甚至于内置的变量和函数.它具备了一 ...

  6. awk基础01-基本用法

    什么是awk     awk 是一门解释型的编程语言,支持条件判断,数组.循环等功能.可用于文本处理.输出格式化的文本信息.执行数学运算.字符串等操作.     awk在处理文件时按行进行逐行处理,即 ...

  7. AWK行处理的用法实例

    第一节 awk的工作流程及基础用法 awk操作符会先检索文件的行信息,然后在行信息里找需要的内容. Awk的默认分割付是空格,awk '/模式/{print $1,$2}' file ##模式的位置可 ...

  8. 『忘了再学』Shell基础 — 27、AWK编程的介绍和基本使用

    目录 1.AWK介绍 (1)AWK概述 (2)printf格式化输出 (3)printf命令说明 2.AWK的基本使用 (1)AWK命令说明 (2)AWK命令使用 1.AWK介绍 (1)AWK概述 A ...

  9. awk 中 FS的用法

    在openwrt文件 ar71xx.sh中 查询设备类型时,有这么一句, machine=$(awk 'BEGIN{FS="[ \t]+:[ \t]"} /machine/ {pr ...

随机推荐

  1. 【mysql】'XXX.XXX.XXX' isn't in GROUP BY问题解决

    原因是mysql的版本低于5.7,使用的GROUP BY 例如:数据库名称为db,表为t,sql为SELECT id, user_name FROM sys_user GROUP BY id 报错为 ...

  2. Zookeeper的介绍与基本部署

    目录 简介 架构 安装 StandAlone模式 1. 安装 2. 修改配置 3. 启动 4. 验证 5. 基本用法 Distributed模式 1. 配置hosts 2. 配置zoo.cfg 3. ...

  3. servlet和response

    servlet基础知识 Servlet在内存中是单例----单实例对象一个Servlet类 在内存中最多有一个对象 一个项目有多少功能,将来就有多少Servlet. servlet是自启动的,就是可以 ...

  4. Elasticsearch 史上最全最常用工具清单

    基础类工具 1.Head插件 1)功能概述: ES集群状态查看.索引数据查看.ES DSL实现(增.删.改.查操作) 比较实用的地方:json串的格式化 2)地址:http://mobz.github ...

  5. java中反射知识点总结

      1 package Demo; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 impo ...

  6. laravel5.4 中 dd和dump的区别。

    在laravel中dd和dump 都是打印的数据的,但是 dd会终止程序的运行,dump不会. 而且dump打印出来的数据在浏览器上是高亮的哦(很有逼格的~). 上图为dump打印出来的. 上图为dd ...

  7. C#安装和卸载windowsService的bat指令

    只需新建2个文本文档,将2个指令分别复制进去,再将txt格式改为bat格式,以管理员身份运行 安装指令 %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\ ...

  8. sql server union与unionALL区别

    两种用法 一样, 查询字段类型需要一致 union 会自动去重 union all  不会去重 select name ,age from student union select name ,age ...

  9. vuex简单化理解和安装使用

     1.简单化理解 首先你要明白 vuex 的目的 就是为了 集中化的管理项目中 组件所有的 数据状态 (state) 0. 第一步你要明白 , store 的重要性 , store 类似一个中央基站, ...

  10. django配置文件

    1.BASSE_DIR BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 当前工程的根目录,Django会依 ...