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. codeforces 612D The Union of k-Segments (线段排序)

    D. The Union of k-Segments time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  2. C++如何拒绝编译器自动生成的函数

    每一个class,编译器都会自动生成四个特殊成员函数: destructor(析构函数) default constructor(默认构造函数) copy constructor(copy构造函数) ...

  3. 不要试图用msvc来编译ffmpeg

    出于学习目的,想建一个vs2010工程来编译ffmpeg(http://www.ffmpeg.org/),但是由于意义不大,并且工作量太大放弃了.原因如下: 1.一些unix平台相关的头文件.库的依赖 ...

  4. Winform程序实现多显示屏、多屏幕显示的2种方法

    这篇文章主要介绍了Winform窗口实现多显示屏显示的2种方法,本文直接给出了实现代码,并对其中的一些重要参数做了解释,需要的朋友可以参考下. 一台主机连接了2台显示器(2个显卡),要求一个程序的两个 ...

  5. unittest ,ddt数据驱动,读取文件中数据,多个参数时的处理

    1. test.yaml中的数据 这里的属性是list 2.创建用例 3,在yaml中创建数据,创建list数据,list中再创建dict数据,这样就可以读取dict中的多个参数的数据了

  6. stm32 奇怪的位赋值问题 出错了

    转载请注明出处:http://blog.csdn.net/qq_26093511/article/category/6094215 1.在51单片机里 ,下面这两种操作方法都是一样的,没有什么问题! ...

  7. docker-machine create --driver virtualbox myvm1 创建失败

    1. 问题描述 docker-machine create --driver virtualbox myvm1 安装完 virtualbox 后,无法创建. 输出内容为: Running pre-cr ...

  8. 问题:C# params类型参数;结果:C#的参数类型:params、out和ref

    C#的参数类型:params.out和ref PS:由于水平有限,难免会有错误和遗漏,欢迎各位看官批评和指正,谢谢~ 首先回顾一下C#声明一个方法的语法和各项元素,[]代表可选 [访问修饰符] 返回值 ...

  9. shell入门-awk-2

    awk的条件操作符 ///显示第一段有root的行 [root@wangshaojun ~]# awk -F ':' '$1=="root"' 1.txtroot:x:0:0:ro ...

  10. 11、perl语言的记录分割符$/ $\

    参考:https://www.jianshu.com/p/8ffd53b1bd41 perl自带的perldoc文档.perldoc -v '$/'  :perldoc -f join $/ #输入记 ...