GNU awk工具的使用解析

GNU awk:

简介:awk是一个数据处理工具。它比较倾向于将一行分成多个“字段”来处理。所以,awk比较适合处理小型数据。

gawk – pattern scanning and processing language

实现原理:

blob.png

基本用法:gawk [options] 'program' FILE

program:PATTERN{ACTION STATEMENTS}语句之间用分号分割

print,printf

选项:

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

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

如:

blob.png

基本常用输出命令

  • print

    • 格式:print item1,item2,…

    • 逗号为分隔符

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

    • 如省略item;则打印$0。

  • 变量

    • 内建变量

FS:input field seperator,默认空白字符。

OFS:output field seperator,默认空白字符。

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

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

NF:number of field,字段数量。

NR:number of record,行数量。

FNR:分别计算各文件行数。

FILENAME:文件名。

ARGC:命令行参数的个数;

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

    • 自定义变量

(1)-v var=value(变量名区分字符大小写)

blob.png

(2)在program中直接定义

blob.png

  • printf命令

    • 格式化输出:printf FORMAT,item1,item2,…

  1. FORMAT必须给出;

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

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

格式符:

%c:显示字符的ASCII码;

%d,%i:显示十进制证书;

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

%f:显示为浮点数;

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

%s:显示字符串:

%u:无符号整数:

%%:显示%自身。

修饰符:

#[.#]:第一个数字控制显示的宽度;第二个数字控制小数的精度。

-:左对齐

+:显示数值的符号

  • 操作符

算术操作符:

x+y, x-y, x*y, x/y, x^y, x%y

-x: 转换为负数

+x: 转换为数值

字符串操作符:没有符号的操作符,字符串连接

赋值操作符:

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

比较操作符:

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

模式匹配符:

~:左边是否和右边匹配包含

!~:是否不匹配

逻辑操作符:&&,||,!

如显示系统账号与root账号

awk –F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd

blob.png

函数调用: function_name(argu1, argu2, …)

条件表达式: selector?if-true-expression:if-false-expression

  • PATTERN:根据pattern条件,过滤匹配的行,再做处理

    • (1)如果未指定:空模式,匹配每一行

    • (2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来

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

awk '!/^UUID/{print $1}' /etc/fstab

    • (3) relational expression: 关系表达式;结果有“真”有“假”;结果为“ 真”才会被处理;

真:结果为非0值,非空字符串

假:结果为空字符串

    • (4) line ranges:行范围 startline,endline:/pat1/,/pat2/ 不支持直接给出数字格式

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

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

    • (5) BEGIN/END模式

BEGIN{}: 仅在开始处理文件中的文本之前执行一次

END{}:仅在文本处理完成之后执行一次

如:开始结束

blob.png

  • awk控制语句if-else

    • 语法: if(condition) statement [else statement] if(condition1){statement1}else if(condition2) {statement 2}else{statement3}

    • 使用场景:对awk取得的整行或某个字段做条件判断

awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd

示例:

blob.png

  • while循环

    • 语法:while(condition) statement

    • 条件“真”,进入循环;条件“假”,退出循环

    • 使用场景: 对一行内的多个字段逐一类似处理时使用 对数组中的各元素逐一处理时使用

  • do-while循环

    • 语法:do statement while(condition)

    • 意义:无论真假,至少执行一次循环体

    • 示例:做1+2+3+…+100

awk 'BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}'

blob.png

  • for循环

    • 语法:for(expr1;expr2;expr3) statement for(variable assignment;condition;iteration process) {forbody}

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

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

  • switch语句

    • 语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}

    • break和continue

      • awk ‘BEGIN{sum=0;for(i=1;i<=100;i++) {if(i%2==0){continue}sum+=i}print sum}‘

      • awk ‘BEGIN{sum=0;for(i=1;i<=100;i++) {if(i==11){break}sum+=i}print sum}‘

      • break [n] n代表跳出第几轮循环

      • continue [n]

    • next 提前结束对本行处理而直接进入下一行处理(awk自身循环) awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd

  • 关联数组:array[index-expression]

    • index-expression:

    • (1) 可使用任意字符串;字符串要使用双引号括起来

    • (2) 如果某数组元素事先不存在,在引用时,awk会自动创建 此元素,并将其值初始化为“空串”

    • (3)若要判断数组中是否存在某元素,要使用“index in array”格 式进行遍历

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

  • for(var in array) {for-body}

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

  • 示例

blob.png

原创文章,作者:502795641,如若转载,请注明出处:http://www.178linux.com/48351

(0)
502795641502795641
上一篇 2016-09-21
下一篇 2016-09-21

相关推荐

  • 什么是文件系统

    文件系统:层级结构;有索引; /: 原初起点; 倒置树状结构; /dev/pts/2: 最左侧/: 表示根目录 其它的/: 表示路径分隔符 Linux的路径分隔符是/ Windows的是\ 文件的路径表示: 绝对路径:从根开始表示出的路径  相对路径:从当前位置开始表示出的路径 文件名使用法则: 严格区分字符大小写:file1, File1, FI…

    Linux干货 2016-10-29
  • 马哥教育网络班N22期+第5周课程练习

    马哥教育网络班N22期+第5周课程练习 1. 显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;  grep -E "^[#][[:space:]]+[^[:space:]].*" /etc/rc.d/rc.sysinit 2. 显示…

    Linux干货 2016-09-19
  • Linux文件与目录管理之权限与命令之间的关系

    Linux文件与目录管理之权限与命令之间的关系 我们知道权限对于用户账户来说是非常重要的,因为它可以限制用户能不能读取/新建/删除/修改文件或目录。在这我们就来说明下什么命令在什么样的权限下才能够运行。         让用户能进入某目录成为“可工作目录”的基本权限是什么     &nbs…

    Linux干货 2017-04-24
  • Linux网络属性管理

    Linux网络属性管理 linux的网络配置方法有多种,而且随发行版及版本而略微不同。我目前的测试环境为CentOS6和CentOS7。 常用的网络配置命令或方法有:ifconfig,route,netstat,ip,ss,nmcli,配置文件。 首先:命令方法介绍 一、命令简介 ifconfig:是个比较传统的命令,可以配置网络接口的启用及关闭,IP地址等…

    系统运维 2016-05-29
  • 标准I/O和管道

    程序包含指令和数据,经常需要读入数据和输出数据 打开的文件都有一个fd:file descriptor(文件描述符) 用nano打开一个文件,查看其PID  0,1,2就是所谓的文件描述符。 在Linux里输入输出和错误都由这三个描述符来表示 标准输入(STDIN) -0 默认接受来自键盘的输入 标准输出(STDOUT)-1 默认输出到终端窗口 标…

    Linux干货 2016-08-08
  • linux计算机基础理论

    1. 计算机的组成及其功能 从基本结构上来讲,计算机可以分为五大部分: 运算器、存储器、控制器、输入设备、输出设备。 运算器的功能:实现算术运算和逻辑运算(与控制器组成CPU) 存储器功能:将输入设备接受到的信息以二进制的数据形式存到存储器中。 控制器的功能:将指令逐条从存储中取出,经译码分析后向全机发出相应的操作控制信号作用于其他部件,使各部件有条不紊地协…

    Linux干货 2018-03-04

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-23 09:15

    写的很好,每一个awk用法都有一个详细的示例,如果能有一部分的示例结果,可能会直观点哦。