原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html

Awk使用说明

运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器),awk(报表生成器),该文档大致讲述一下awk语法和在日常运维工作中使用awk带来的好处和效率。再感叹一下awk实在是太强大了,完全是一门编程语言!(网上awk资料很多,自己整理Mark一下)

提示:Linux使用的gawk

官方解释:gawk - pattern scanning and processing language

[root@test ~]# ll /bin/awk

lrwxrwxrwx. 1 root root 4 Mar 16  2016 /bin/awk -> gawk

语法格式

awk [ POSIX or GNU style options ] 'program-file/script' file ...

awk [ POSIX or GNU style options ] 'program-text/PATTERN {action}' file ...

下面一一讲解各个参数的含义和用法

 

一:Options

参数选项,个人理解为打印报表输出指定哪种属性,一般用的最多的就是-F、-v两个参数

-F/--field-separator:Use fs for the input field separator.(分隔符文本切割字符串)

该参数支持各种表达式,包括正则表达式 如:-F "^m"

举例:ifconfig eth0 | awk -F "addr:| Bcast:" 'NR==2{print $2}'

-v:Assign the value val to the variable var, before execution of the program begins.

Action内部可以引用脚本外的变量

举例:awk -v var="verrion" 'BEGIN{print var}'

二:行为模式

'program-text/PATTERN {action}':必须用单引号引用,中间的模式和action完全是一门编程语言,语法和其他编程或脚本语言类型,具有变量、逻辑语句等。

1、PATTERN模式

'program-text/pattern {action}'

模式类型

解释说明

举例

empty

空模式:匹配任意输入行

awk -F: '{print $1}' /etc/passwd

RE

正在表达式:格式为/regular expression/

awk -F: '/^m/{print $1}' /etc/passwd

BEGIN/END

仅在awk命令执行时运行一次或者结束前运行一次

awk -F: 'BEGIN{un="Username";id="Id";shell="Shell";printf "%-10s%-10s%-20s\n",un,id,shell}{printf "%-10s%-10s%-20s\n",$1,$3,$7'} /etc/passwd

Expression

表达式:其值非0或非空字符时满足条件

awk -F: '$1=="verrion"{print $1}' /etc/passwd

Ranges

指定范围匹配:格式为pat1,pat2

awk -F: '/^r/,/^m/{print $1}' /etc/passwd

2、常见的action

分类

解释说明

action类型

Action支持各种类型,如下:

expression表达式

regular expression正则表达式

Pattern expression模式匹配表达式

control statements控制语句

compound statements复合语句

Input statements输入语句

Output statements输出语句

下面语法会一一讲解

模式

指定一个行的范围,该语法不能包括BEGIN/END模式

BEGIN

让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量

END

让用户在最后一条输入记录被读取之后所发生的动作

3、语法如下

1)变量

要点

类型

说明

内置变量

记录变量

FS:field separator,读取文本时所使用的列分隔符

RS:Record separator,输入文本信息所使用的行分隔符

OFS:Output field separator

ORS:Output record separator

如:awk -F:  OFS="#"   FS="#"

数值变量

NR:The number of input records;awk命令所处理的记录数,如果有多个文件,这个数目会把处理的多个文件中读取的行统一计数;

NF:number of field;当前记录的field(列)个数;

FNR:与NR不同的是,FNR用于记录的行数是当前文件的总读取的行数;

ARGV:数组,保存命令行整个字符串,如awk '{print $0} test1.txt test2.txt'这个命令中,ARGV[0]保存awk,ARGV[1]保存test1.txt;

ARGC:awk命令参数的个数;

FILENAME:awk处理的文件名;

外来变量

自定义变量

用户自定义自己的变量以便在程序或者脚本中使用,变量名命令规则和其他程序语言相同,只能以字母

数字和下划线开头,gawk变量名称区分字符大小写

在脚本中赋值变量

给变量赋值使用赋值语句进行,比如:

awk 'BEGIN{var="verrion";print var}'

在命令行中赋值变量

在脚本外为变量赋值,并在脚本中进行引用,比如:

awk -v var="verrion" 'BEGIN{print var}'

 

2)数组

要点

说明

解释

表达式

array[index-expression]

可使用任意字符串,需要注意的是:如果某数组元素不存在,则自动创建此元素并初始化为空串;

下标值

不同之处

重点:不同于其他语言的数组,其下表值不止于数字,可以是字符串,同时每个下标值可以做累积

遍历元素

For循环

for(var in array){statement,...}

其中var用于引用数组的下标,而不是元素

判断元素

index in array

要判断某数组中是否存在某元素,需要使用index in array方式

删除数组

delete array[index]

从关系数组中删除数组索引需要用delete命令

典型案例

语法for(i in array){statement1;statement2;....}

1.awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){print "%15s;%i\n",A,BASH[A]}}' /etc/passwd

2.netstat -ant | awk '/^tcp/{++S[$NF]} END{for(a in S) print a,S[a]}'

 

3)操作符

类型

要点

说明

算法

数值运算

-x:负值   +x:转换为数值   x^y或x**y:次方

x*y:乘法  x/y:除法  x+y:加法  x-y:减法 x%y:求余

字符串

字符串连接

只有一个,而且不用写出来,用于字符串连接

比如:awk 'BEGIN{a="a";b="b";c=(a""b);print c}'

赋值

类似于算法操作

=:变量赋值 +=  -=  *=  /=  %=  ^=  **=

++:自增

--:自减

需要注意的是:如果某模式为*号,此时使用/*/可能会有语法错误,应以/[*]/替代;

布尔值

True/false

任何非0值或非空字符串都为真,反之就为假;

比较

数值比较
字符串匹配

x<y  x<=y  x>y  x>=y  x==y  x!=y

x~y y是个模式,x能被匹配到

x!~y 不匹配模式

逻辑关系

并且或者

&&:前一个条件满足才执行后一个条件

||:前一个条件不满足才执行后一个条件

条件表达式

复合表达式

selector?if-true-exp:if-false-exp
selector为真,执行if-true-exp,否则执行if-false-exp

函数调用

函数调用

function_name(argv1,argv2)

4)控制语句

表达式

语法

举例

if-else

if(condtion){then-body}else{[eles-body]}

awk -F: '{if ($1=="root") print $1,"Admin";else print $1,"Common User"}' /etc/passwd

while

while(condtion){statement;....}

awk -F: '{i=1;while(i<=3){print $i,i++}}' /etc/passwd

do-while

do{statement;....}while(condtion)

awk -F: '{i=1;do {print $i,i++}while(i<=3)}' /etc/passwd

for

for(variable assignment;condtion;iteration process){statement;....}

awk -F: '{for(i=1;i<=3;i++)print $i}' /etc/passwd

case

switch(expression){case VALUE or /REGEXP/;statement1,statement2,...,default;statementN,...}

BEGIN {foo = 1;switch (foo) {case 3:print "x";break;case 2:print "y" ;break;case 1:print "z" ;break;default:print "default" ;}}

break和continue

常用于循环和case语句

awk -F: '{for(i=1;i<=3;i++)if($i==root)break;print $i}' /etc/passwd

next

提前结束对本行文字的处理,并接着处理下一行

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

 

5)打印输出

打印类型

使用方法

注意事项

print

prinf使用格式print item,....

1:各item之间使用逗号分开,而输出以空白输出;

2:输出的item可以为字符串或数值,如记录的字段(如$1),变量或awk的表达式,数值会先转换为字符串,然后再输出;

3:print后面的item可以省略,则如print $0,因此,如果想输出空白行,则需要使用print ""

printf

printf使用格式:

printf format, item....

1:与print最大不同在于printf需要指定format;

2:format用于指定后面的每个item输出格式;

3:printf不会自动打印换行符:\n

format格式的指示符都以%开头,如下:

%c:显示字符的ASCII码;

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

%f:显示浮点数;

%s:显示字符串;

%u:无符号整数;

%%:显示%本身;

修饰符:

N:显示宽度;

-:左对齐;

+:显示数字符号;

如:%-10s 表示左对齐输出长度10个的字符串

6)函数

类型

常用函数

举例

内置函数

数值函数rand():返回0-1之间的一个随机数

awk 'BEGIN{print rand()}'

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

awk -F: '{print length($1)}' /etc/passwd

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

awk -F: '{print sub(o,O,$1)}' /etc/passwd

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

ls -l /etc/hosts | awk -F "" '{gsub("r","4")};{gsub("w","2")};{gsub("x","1")};{gsub("-","0");print $2+$3+$4 $5+$6+$7 $8+$9+$10}'

split(s,a[,r]):以r为分隔符分割字符s,并将分割后的结果保存至a数组中,数组以下标为1开始的序列

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

自定义函数

可以在引号中的任意地方定义,用{}表示块整体,可以定义参数,但调用时可带可不带

用法如下:

awk '

function max(a,b,c)

{

return a>b?a:b

}

{print max($1,$2)}' file

说明:显示每行前两个域的较大值,max为函数名,a、b为参数

awk使用说明的更多相关文章

  1. awk使用说明(复制别人的)

    来源:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 简介 awk是一个强大的文本分析工具,相对于grep的查找,se ...

  2. awk中printf的使用说明

    printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息.在编写程序时经常会用到此函数.printf()函数的调用格式为: printf("", ); 其中 ...

  3. Linux的文本处理工具浅谈-awk sed grep

    Linux的文本处理工具浅谈 awk   老大 [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS ...

  4. awk sed grep 详解

    Linux的文本处理工具浅谈 awk [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS竖着切,列 ...

  5. linux命令之awk

    简介 awk命令的名称是取自三位创始人Alfred Aho .Peter Weinberger 和 Brian Kernighan姓名的首字母,awk有自己的程序设计语言,设计简短的程序,读入文件,数 ...

  6. awk sed grep 常用命令

    文本间隔 在每一行后面增加一空行: sed G sed G v1 >v2 在每一行后面增加两行空行: sed 'G;G' 将第一个脚本所产生的所有空行删除(即删除所有偶数行): sed 'n;d ...

  7. sed初理多行合并+sed之G、H、g、h使用+sed n/N使用说明

    转载:[shell]sed处理多行合并 - seyjs - 博客园 (cnblogs.com) 文件格式 table=t1 name owner address table=t2 id text co ...

  8. Atitit.项目修改补丁打包工具 使用说明

    Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...

  9. awk命令简介

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

随机推荐

  1. ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发布静态文件

    虽然ASP.NET Core是一款"动态"的Web服务端框架,但是在很多情况下都需要处理针对静态文件的请求,最为常见的就是这对JavaScript脚本文件.CSS样式文件和图片文件 ...

  2. Redis的简单动态字符串实现

    Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...

  3. $ORACLE_HOME变量值末尾多“/”惹的祸

    之前一直误以为$ORACLE_HOME变量的路径中末尾多写一个"/"不会有影响. 今天做实验时碰到一个情景,发现并不是这样. 环境:OEL 5.7 + Oracle 10.2.0. ...

  4. springMVC初探--环境搭建和第一个HelloWorld简单项目

    注:此篇为学习springMVC时,做的笔记整理. MVC框架要做哪些事情? a,将url映射到java类,或者java类的方法上 b,封装用户提交的数据 c,处理请求->调用相关的业务处理—& ...

  5. 初学seaJs模块化开发,利用grunt打包,减少http请求

    原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...

  6. Python学习

    Python基础教程        网易云课堂-零基础入门学习Python

  7. 5.2 Array类型的方法汇总

    所有对象都具有toString(),toLocaleString(),valueOf()方法. 1.数组转化为字符串 toString(),toLocaleString() ,数组调用这些方法,则返回 ...

  8. Android开发学习—— Fragment

    #Fragment* 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容* 生命周期方法跟Activity一致,可以理解把其为就是一个Activity* 定义布局文件作 ...

  9. [转]NopCommerce How to add a menu item into the administration area from a plugin

    本文转自:http://docs.nopcommerce.com/display/nc/How+to+code+my+own+shipping+rate+computation+method Go t ...

  10. [LeetCode] Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...