gawk

作者:Aho, Weinberger, Kernighan

版本:

  • GNU awk:gawk
  • New awk:nawk

简介:格式化文本输出工具,模式扫描及处理语言;报告生成器。

用法:gawk  [  options  ]  '  PATTERN  {  ACTION  STATEMENTS  }'  FILE ...

gawk [options] 'program' FILE ...

program : PATTERN{ACTION STATEMENTS}

1、选项(options)

1.1:-f file:指定awk脚本文件

1.2:-F : 输入数据时的字段分隔符

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

2、PATTERN

1)空模式,匹配每一行

2)/正则表达式/:仅处理被模式匹配到的行

3)关系表示式(条件表示式):布尔值类型,结果为真(非0或非空字符串)则处理;结果为假(0或空字符串)则不处理

4)地址定界;支持PATTERN和条件表达式;不支持数字直接定界

5)BEGIN/END模式;BEGIN{}:仅在文本处理之前执行;END{}:仅在文本处理完成之后执行

3、ACTIONS

3.1、表达式

1)三目表达式:selector?if-true-expression:if-false-expression

如果selector为真,则执行if-true-expression;如果selector为假,则执行if-false-expression。

3.2、控制语句

1)if-else 语法:if(condition) statement [else statement]

2)while 语法:while(condition) statement 条件真进入循环,条件假退出循环

3)do-while 语法:do statement while(condittion) 先执行一次do,然后判断是否进入循环

4)for 语法:for(variable assignment; condition; iteration process){for-body}

*特殊用法:能够遍历数组中的元素,for(var in array) {for-body}

5)switch 语法:switch(expression) {case VALUE1 or /PEGEXP/: statement; case VALUE2 or /PEGEXP2/: statement; ... ;default: statement}

6)next:控制awk的内生循环,提前结束对本行的处理直接进入下一行

7)continue | break | exit:退出循环,和shell中用法相同

3.3、组合语句

1)组合语句需要将多条语句放到大括号内

3.4、输入语句

3.5、输出语句

3.5.1、print item1, item2, ... 输出命令

1)逗号为分隔符

2)输出的各item可以是字符串,也可是数值当前记录字段、变量或awk的表达式

3)如果省略item,则相当于print $0

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

1)FORMAT必须要给出

2)不会自动换行,需要显示给出换行控制符,\n

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

4)格式符

  • %c:显示字符的ASCII码;
  • %d,%i:显示十进制整数;
  • %e,%E:科学计数法数值显示;
  • %f:显示为浮点数;
  • %g,%G:以科学技术法或浮点数形式显示数值;
  • %s:显示字符串;
  • %u:无符号整数;
  • %%:显示%自身

5)修饰符

  • M[.N]:M控制数组显示的宽度,N控制小数点的精度
  • -:左对齐显示,默认右对齐
  • +:显示数值的符号

4、变量

4.1、内建变量

FS:输入字段分隔符,默认为空白字符

OFS:输出字段分隔符,默认为空白字符

RS:输入记录分隔符

ORS:输出记录分隔符

NF:字段数量;{print $NF}:表示最后字段值

NR:行数,对不同文件行数累加计数

FNR:行数,对不同文件行数分别计数

FILENAME:显示当前文件名

ARGC:命令行参数个数

ARGV:数组,保存的是命令行中给定的各参数,使用ARGV[#]引用

4.2、自定义变量

1)-v var=value 在选项中定义

2)在program中直接定义

5、数组

关联数组:array[index-expression]

index-expression:

1)可以使用任意字符,字符串要使用双引号;

2)如果某数组元素事先不存在,在引用时awk会自动创建此元素并将其值初始化为“空串”;若要判断数组中是否存在某元素,需要使用"index in array"格式进行;

delete array[index]:删除数组中的单个元素

delete array:删除整个数组

6、函数

6.1、内置函数

srand():生成随机数种子

rand():返回1和0之间的随机数(小数)

int():对数取整

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

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

gsub(r, s, [t]):以r表示的模式来查找t所表示的字符串所匹配的内容,并将其所有出现的替换为s所指定的内容

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

system():在awk中调用shell命令,shell命令需要用双引号引起来,awk变量一定不能被双引号引起来

6.2、自定义函数

function name ( parameter1, parameter2, ... ) {
statements
return expression
}

7、awk中的操作符

7.1、算术操作符:

  • +  -  *  /  ^  %
  • -x:整数转换为负数
  • +x:字符串转换为数值

7.2、赋值操作符:

  • =  +=   -=   /=   %=   ^=   ++   --

7.3、比较操作符:

  • >  <  >=  <=  !=  ==

7.4、模式匹配符:

  • ~:左侧的字符串是否能够被右侧的模式匹配
  • !~:左侧的字符串是否能够被右侧的模式不匹配

7.5、逻辑操作符:

  • && (并且)
  • ||    (或者)
  • !       (否)

8、awk脚本

格式:

#!/bin/awk -f

#this is a awk test script

{ACTION  STATEMENTS}

调用:

test.awk  /path/file

awk用法示例:

1、从passwd文件中取出user,uid,shell

~]# awk -F: '{print $1,$3,$7}' /etc/passwd
~]# awk -v FS=":" '{print $1,$3,$7}' /etc/passwd

2、从passwd文件中取出user,uid,shell并且以":"为分隔符输出

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

3、以空格为换行符输出

~]# awk -v RS=' ' '{print}' /etc/passwd

4、输出每行有多少个字段

~]# awk '{print NF}' /etc/passwd

5、输出文件行号(有多少行)

~]# awk '{print NR}' /etc/passwd

6、俩个文件分别打印行号

~]# awk -F: '{print FNR}' /etc/passwd /etc/fstab

7、打印命令行有几个参数

~]# awk -F: 'BEGIN{print ARGC}' /etc/passwd /etc/fstab

8、打印命令行第1个参数

~]# awk -F: 'BEGIN{print ARGV[1]}' /etc/passwd /etc/fstab

9、自定义变量,打印hello world

~]# awk -v var='hello world!' 'BEGIN{print var}'

10、格式化输出username,UID,shell类型

~]# awk -F: '{printf "Username:%-15s--Uid:%-4d--Shell:%s\n",$1,$3,$NF}' /etc/passwd

11、三目表达式来判断系统用户和普通用户

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

12、查看fstab文件中的UUID

~]# awk '/^UUID/{print $1}' /etc/fstab

13、查看passwd文件中UID大于1000的用户

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

14、查看shell为bash的用户

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

15、显示行首为从root到sshd的行

~]# awk '/^root/,/^sshd/{print $0}' /etc/passwd

16、指定显示从第三行到第十行

~]# awk '(NR>=3&&NR<=10){print $0}' /etc/passwd

17、打印表头和表尾,格式化输出

~]# awk -F: 'BEGIN{print "      username      uid  \n------------------------"}{printf "%13s:%8d\n",$1,$3}END{print "==========end========="}' /etc/passwd

18、用if判断uid是否大于1000

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

19、用双分支if语句输出用户的类型

~]# awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "system user: %s\n",$1}}' /etc/passwd

20、打印大于5个字段的行

~]# awk '{if(NF>5){print $0}}' /etc/fstab

21、显示系统上磁盘的使用率超过20%的分区

~]# df |awk -F% '/^\/dev\/sd/{print $1}' |awk '{if($NF>20){print $1,$NF}}'

22、统计grub.cfg文件中以linux16开头的行的所有字段长度

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

23、统计grub.cfg文件中以linux16开头的行的所有字段长度的长度大于等于7的字段

~]# awk '/^[[:space:]]*linux16/{i=1; while(i<=NF){if(length($i)>=7) {print $i,length($i)}; i++}}' /boot/grub2/grub.cfg
~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++){if(length($i)>=7) {print $i,length($i)}}}' /boot/grub2/grub.cfg

24、打印UID为偶数的用户

~]# awk -F: '{if($3%2) next; print $1,$3}' /etc/passwd

25、统计tcp的连接状态

~]# ss -tan |awk '{state[$1]++}END{for(i in state){print i,state[i]}}'

26、统计httpd的日志,统计访问的ip

~# awk '{ip[$1]++}END{for(i in ip){printf "%20s:%d\n",i,ip[i]}}' /var/log/httpd/access_log 

27、统计tcp连接客户端IP地址

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

个人学习笔记,记录于2018.5.15 19:14

文本处理三剑客之gawk的更多相关文章

  1. Linux文本处理三剑客之grep及正则表达式详解

    Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...

  2. Linux文本处理三剑客之——grep

    一Linux文本处理三剑客之——grep Linux文本处理三剑客都支持正则表达式 grep :文本过滤( 模式:pattern) 工具,包括grep, egrep, fgrep (不支持正则表达式) ...

  3. Linux 文本处理三剑客之grep

    文本处理都要使用正则表达式,正则表达式有: 基本正则表达式:grep或者egrep -G 扩展正则表达式:egreo或者grep -E Linux 文本处理三剑客: sed:stream editor ...

  4. 文本处理三剑客之sed命令

    第十八章.文本处理三剑客之sed命令 目录 sed介绍 sed命令常用选项 sed常用编辑命令 sed使用示例 sed高级语法 18.1.sed简介 sed全名stream editor,流编辑器,s ...

  5. 文本处理三剑客之 Sed ——一般编辑命令

    sed简介 sed (stream editor for filtering and transforming text) 是Linux上的文本处理三剑客之一,另外两个是grep和awk. sed又称 ...

  6. 文本处理三剑客之 grep

    grep简介 grep(Global search REgular expression and Print out the line)是Linux上的文本处理三剑客之一,另外两个是sed和awk. ...

  7. shell脚本之正则表达和文本处理(文本处理三剑客:1、grep 2、sed 3、awk)

    文本处理三剑客:1.grep  2.sed  3.awk 一.grep:(过滤) grep的使用,主要的参数有: -n  :显示行号:-o  :只显示匹配的内容-q  :静默模式,没有任何输出,得用e ...

  8. Linux文本处理三剑客之sed

    推荐新手阅读[酷壳]或[骏马金龙]开篇的教程作为入门.骏马兄后面的文章以及官方英文文档较难. [酷壳]:https://coolshell.cn/articles/9104.html [骏马金龙-博客 ...

  9. 关于Linux文本处理“三剑客”的一些小操作。

    Linux文本处理“三剑客”,即grep.sed.awk,这是Linux中最核心 的3个命令. 一.首先做个简单的介绍: 1.awk:linux三剑客老大,过滤,输出内容,一门语言.NR代表行号. 2 ...

随机推荐

  1. xxx was built without full bitcode" 编译错误解决

    xxx was built without full bitcode" 编译错误解决 iOS 打包上线 All object files and libraries for bitcode ...

  2. BestCoder Round #92 比赛记录

    上午考完试后看到了晚上的BestCoder比赛,全机房都来参加 感觉压力好大啊QAQ,要被虐了. 7:00 比赛开始了,迅速点进了T1 大呼这好水啊!告诉了同桌怎么看中文题面 然后就开始码码码,4分1 ...

  3. NOIp2018集训test-10-17 (bike day3)

    发现自己gradully get moodier and moodier了 负面情绪爆发地越来越频繁,根本out of control,莫名其妙地就像着了魔一样 为什么用英语大概是因为今天早上早自习因 ...

  4. log4net 使用

    1. 代码中使用配置文件: log4net.Config.DOMConfigurator.Configure(new FileInfo("log4netConfig.xml")); ...

  5. iOS获取设备型号的方法

    1. [UIDevice currentDevice].model   自己写的看只抓到模拟器和iPhone.暂时不推荐. 2.自己写的找的方法再添加.直接  NSString * deviceMod ...

  6. HDOJ1251(前缀匹配---分块查找&map应用)

    分块查找算法 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm ...

  7. JasperReports项目中的应用

    转自:http://www.blogjava.net/vjame/archive/2013/10/12/404908.html . 2.业务处理 //返回报表查询结果 List<ReportEl ...

  8. IOS网络同步请求

    //1.目标地址 NSString *url_string = @"http://b33.photo.store.qq.com/psu?/05ded9dc-1001-4be2-b975-13 ...

  9. CentOS 7 配置 samba服务器

    一.在服务器端上安装软件并进行相关配置(以下操作需用用户root进行): 1.安装samba: yum -y install samba samba-client 2.启动服务并设置开机启动: sys ...

  10. Unusual Sequences

    题意: 求解合为 y 的总体 gcd 为 x 的正整数非空序列个数. 解法: 特判一下后,原问题等价于合为 s = y/x 的整体gcd为1的正整数序列个数. 1.$ans = \sum_{\sum{ ...