awk(gawk):报告生成器,格式化文本输出:awk,gawk

基本用法:gawk [options] ‘program’ FILE ...

program: PATTERN{ACTION STATEMENT};可以有多个,语句之间用分号分隔

print,printf

选项:

-F:指明输入数据时用到的字段分隔符

-v var=value:自定义变量;

变量:

1)内建变量

FS:input field seperator(输入字段分隔符,默认为空白字符)

#awk -v FS=':' '{print $1}' /etc/passwd

#awk -F: ‘{print $1}’ /etc/passwd(这个命令和上面的命令效果是一样的)

注:使用FS可以一次使用多个字符做为分隔符;例:awk -v FS="[,:]" '{print $3,$1,$2}' d.txt

OFS:output field seperator(输出字段分隔符,默认为空白字符)

#awk -v FS=':' -v OFS=':' '{print $1,$3,$7}' /etc/passwd

RS:input record seperator,输入时的换行符;

ORS:output record seperator,输出时的换行符;

NF:number of field,每一行字段数量

{print NF},{print $NF}(在awk中引用变量不需要加$符号)

一行中的最后一个字段用$NF表示

NR:number of record,处理过的行数

#awk ‘{print NR}’ /etc/fstab

FNR:每一个文件处理过的行数

#awk ‘{print FNR}’ /etc/fstab /etc/issue

FILENAME:当前正在处理的文件的文件名

#awk ‘{print FILENAME}’ /etc/fstab

ARGC:命令行参数的个数

#awk 'BEGIN{print ARGC}' /etc/fstab

ARGV:数组,保存的是命令行所给定的各参数

#awk 'BEGIN{print ARGV[0]}' /etc/fstab

2)自定义变量

-v var=value

变量名区分字符大小写;

#awk -v test='Hello gawk' 'BEGIN{print test}'

在program中直接定义

#awk 'BEGIN{test="Hello gawk";print test}'

操作符:

算术运算操作符:

x+y,x-y,x*y,x/y,x^y(次方),x%y

-x

+x:转换为数值

字符串操作符:默认为没有符号的操作符:表示字符串连接

赋值操作符:

=,+=,-=,*=,/=,%=,^=

比较操作符:

>,>=,<,<=,!=,==

模式匹配符:

~:是否匹配

!~:是否不匹配

逻辑操作符:

&&:与

||:或

!:非

函数调用:

function_name(argu1,argu2,...)

条件表达式:

selector?if-true-expression:if-false-expression

#awk-F: '{$3>=1000?usertype="Common User":usertype="SysadminUser";printf                    "%15s:%-s\n",$1,usertype}' /etc/passwd

printf格式化输出:

格式化输出的命令:printf FORMAT,item1,item2,...

(1)FORMAT必须要给出

(2)Printf不会自动换行,如果需要换行,需要显式给出换行控制符,\n

(3)FORMAT中需要分别为后面的每个item指定一个格式化符号

格式符:

%c:显示字符的ASCII码;

%d,%i:显示十进制整数;

%e,%E:科学计数法计数显示

%f:显示为浮点数

%g,%G:以科学计数法或浮点形式显示数值;

%s:显示字符串

%u:无符号整数;

%%:显示%自身;

修饰符:

#[.#]:第一个数字用来控制显示的宽度:第二个#表示小数点后的精度,可以省略

#awk -F: '{printf "Username:%20s UID:%d\n",$1,$3}' /etc/passwd

-:左对齐

#awk -F: '{printf "Username:%-20s UID:%d\n",$1,$3}' /etc/passwd

+:显示数值的符号,负数显示为-,正数显示为+号

#awk -F: '{printf "Username:%20s UID:%+d\n",$1,$3}' /etc/passwd

模式匹配:

1)empty:空模式,匹配每一行;

2)/regular expression/:仅处理能够被此处的模式匹配到的行

#awk '/^#/{print}' /etc/fstab

#awk '!/^#/{print}' /etc/fstab

3)relational expression:关系表达式,结果有”真“有“假”:结果为”真“才会被处理:真:结果为非0值,非空字符串;

#awk -F: '$3>=1000{print $1,$3}' /etc/passwd

#awk -F: '$3<=1000{print $1,$3}' /etc/passwd

#awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd

#awk -F: '$NF~/bash$/{print $1,$NF}' /etc/passwd

4)line ranges:地址定界(行范围)

#awk -F: '/^root/,/^liu/{print $1}' /etc/passwd

注意:不支持直接给出数字的格式

#awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd

5)BEGIN/END模式

BEGIN{}:表示仅在开始处理文件中每一行文本之前执行一次的程序;

END{};表示仅在文本处理完成之后,命令结束之前执行一次的程序;

条件判断,循环:

条件判断:

if(condition){statements}

例:#awk -F: '{if($3>=1000) print $1,$3}' /etc/passwd

if(confition){statements} else {statements}

例:#awk -F: '{if($3>=1000) {printf "Commono user:%s\n",$1} else {printf "root orSysuser:%s\n",$1}}' /etc/passwd

循环:

while(condition) {statements}:条件为“真”,进入循环:条件为“假”,退出循环

例:#awk -v i=1 'BEGIN{while(i<=4){print i;++i}}'

for(expr1;expr2;expr3) {statements}

例:#awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' grub2.cfg

for(var in array) {for-body}:常用于遍历数组中的元素

例:#netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) {print i,state[i]}}'

#awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /usr/logcal/nginx/logs/access.log

跳出循环:

break:跟出整个循环

continue:跳出当前循环,进入下一个循环

next:提前结束对本行的处理,直接进入下一行

例:#awk -F: '{if($3%2!=0) next;print $1,$3}' /etc/passwd

数组:

    关联数组是awk一个独特的特征,它的一个强大的功能就是可以使用字符串作为一个数据的下标

Index-erpression:

若某数组事先不存在,则在使用时直接创建,并将其初始化为空的数组;

可使用任意字符串作为下标;字符串要使用双引号;

若要判断数组中是否存在某元素,要使用”index in array“格式进行:

若要遍历数组中的每个元素,要使用for循环;

for(var in array) {for-body}

注意:var会遍历array的每个索引;

删除数组中的元:

delete array[subscript]

函数:

awk的内置函数可以分为两组:算术函数和字符串函数

1)内置函数

数值处理:

rand():返回0和1之间一个随机数;

字符串处理;

length([s]):返回指定字符串的长度

sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;

gub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其全部替换为s所表示的内容;

split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;

#netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'

getline函数:

getline函数的作用是从文本中读取内容,也可以从管道中接收内容

getline函数的用法比较特殊,不能使用getline(),它的语法不允许有圆括号,只能使用getline

从文件中读取内容:getline < "a"  --> 从文件a中读取内容,小于号表示重定向,不能理解为小于号

将读取的内容赋给一个变量:getline name < "a"

2)自定义函数

练习:

1.统计/etc/fstab文件中每个文件系统类型出现的次数;

2.统计指定文件中每个单词出现的次数;

3.统计下面语句中,每个单词及字符出现的个数

the squid project provides a number of resources toassist users design,

implement and support squid installations. Please browsethe documentation

and support ections for more infomation

4.统计grade.txt中的分数的平均数

mona 70 77 85 83 70 89

john 85 92 78 94 88 91

andrea 89 90 85 94 90 95

jasper 84 88 80 92 84 82

dunce 64 80 60 60 61 62

ellis 90 98 89 96 96 92

5.在问题4的基础上统计grade.txt中班级平均分数,并以A,B,C,D为同学平均分做出分类并统计?

6.文件test中有如下内容:

zhangsan     80

lisi         81.5

wangwu       93

zhangsan     85

lisi         88

wangwu       97

zhangsan     90

lisi         92

wangwu       88

要求输出格式:(average:平均成绩,total:总成绩)

name#######average#######total

zhangsan   xxx            xxx

lisi       xxx            xxx

wangwu     xxx            xxx

答案:

1.

1
#awk '!/^#/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab

2.

1
#awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab

3.

统计字符出现的次数

1
#grep -o "\w" c.txt | awk '{s[$1]++}END{for (key in s) print key,s[key]}'

统计单词出现的次数

1
#awk 'BEGIN{RS="[ .,]+"}{words[$1]++}END{for(i in words){print i,words[i]}}' c.txt

4.

1
2
3
4
5
6
7
8
9
[root@localhost ~]# cat 8.awk 
{
total=0
for(i=2;i<=NF;i++){
total += $i
avg=total/(NF-1)
}
print NR,$1,avg
}

5.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[root@localhost ~]# cat grades.awk 
BEGIN{OFS="\t"}
{
total=0
for(i=2;i<=NF;i++){
total += $i
avg=total/(NF-1)
}
student_avg[NR]=avg
if(avg>=90) grade="A"
else if(avg>=80) grade="B"
else if(avg>=70) grade="C"
else if(avg>=60) grade="D"
else grade="F"
++class_grade[grade]
}
END{
for(x=1;x<=NR;x++){
    class_avg_total += student_avg[x]
    print student_avg[x]
}
class_average=class_avg_total/NR
for(x=1;x<=NR;x++){
    if(student_avg[x]>=class_average)
        ++above_average
    else
        ++below_average
}
print ""
print "班级平均分数:",class_average
print "大于平均分数有:"above_average" 位同学!"
print "低于平均分数有:"below_average" 位同学!"
for(letter_grade in class_grade){
    print letter_grade":" class_grade[letter_grade] | "sort"
}
}

6.

1
2
3
4
5
6
7
8
[root@localhost ~]# awk 'BEGIN{print "name\taverage\ttotal"}{a[$1]+=$2;b[$1]++}END{for(i in a){print i"\t"a[i]/b[i]"\t"a[i]}}' test
name    average total
zhangsan    85  255
wangwu  92.6667 278
lisi    87.1667 261.5
解析:
    a[$1]+=$2:把第一列作为数组的下标,累计相加的结果作为对应数组的元素(即值)
    b[$1]++:把第一列作为数组的下标,每出现一次计数器加1并且作为数组的元素(即值)
本文转自激情燃烧的岁月博客51CTO博客,原文链接http://blog.51cto.com/liuzhengwei521/1883752如需转载请自行联系原作者                             weilovepan520

awk命令用法及编程相关推荐

  1. 今天学到的几个有用的awk命令用法

    一,awk概述 awk 处理机制 :awk 会逐行处理文本 , 支持在处理第一行之前做一些准备工作 , 以及在处理完最后一行做一些总结性质的工作 在命令格式上分别体现如下 : BEGIN{}: 读入第 ...

  2. 3.1.3 awk命令用法

    awk命令 1.一种编程语言,用于在Linux/Unix下对文本和数据进行扫描与处理,数据可以来自标准输入.文件和管道. 2.工作流程:逐行扫描文件,寻找匹配特定模式的行,并在其上进行用户想要的操作. ...

  3. linux查询awk命令用法

    原文链接 : http://blog.chinaunix.net/uid-23302288-id-3785105.html awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或 ...

  4. Linux awk命令用法

    概述 awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理 awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0 ...

  5. AWK用法示例 awk命令

    AWK:Linux 管理员的智能工具包 作者 Emmett Dulaney AWK 实用工具带有其自己的自包含语言,它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一.这种编程及 ...

  6. Linux Shell脚本编程--awk命令详解

    简单使用: awk :对于文件中一行行的独处来执行操作 . awk -F :'{print $1,$4}' :使用':'来分割这一行,把这一行的第一第四个域打印出来 . 详细介绍: AWK命令介绍 a ...

  7. linux awk命令

    2019独角兽企业重金招聘Python工程师标准>>> 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单 ...

  8. 常见Shell命令用法总结

    2019独角兽企业重金招聘Python工程师标准>>> 常见命令用法总结 -----  目录:  --- 关于grep的总结   关于egrep的总结   关于tr的总结  关于so ...

  9. 【转】Linux awk命令详解

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

最新文章

  1. python绘制月亮_Python函数
  2. 新僵尸病毒猖獗 Facebook成攻击目标
  3. Android依赖注入:Google Guice on Android的使用及相关资源
  4. 智能车竞赛线上比赛部分镜头
  5. 【es6】es6学习笔记
  6. UDP(socket)接和数据案例封装成C++代码
  7. 从菜鸟到专家的五步编程语言学习法
  8. Linux各个文件夹的作用~~~非常实用!!
  9. 机器学习算法总结--线性回归和逻辑回归
  10. 广州.NET俱乐部 VSTS活动报道
  11. 3002基于二叉链表的树结构相等的判断(附WA的可能情况)
  12. 95-849-040-源码-RPC-Flink中的RPC使用
  13. apache kafkac系列lient发展-java
  14. PDF文件编辑密码解除
  15. Windows10查看便签
  16. PIC16F877A与Proteus仿真-2位7段数码管驱动
  17. delete hive_hive执行更新和删除操作
  18. 遇到问题--python--BLOB/TEXT column 'code' used in key specification without a key length
  19. S5PV210 buzzer驱动
  20. Typer Girl安装补丁DLC

热门文章

  1. 案例分享 | 圆柱锂电池入壳焊后缺陷检测
  2. 4.4.2 Measuring Credit Risk
  3. 松下TZ1,TZ3与佳能A710IS三款DC的比较
  4. windows下可运行的OD
  5. 卷积神经网络——目标检测之Faster R-CNN论文翻译
  6. 【P50】TDA1543 解码 DIY Part3:全分立 IV 转换
  7. WordPress站群文章更新器,批量WordPress站群文章管理
  8. python数值类型有哪四个直辖市_python中常见的Numberl类型(四)
  9. win10固态硬盘还需要分区吗? 不需要
  10. mysql 通用造数据脚本