awk使用说明
原文地址: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 |
函数调用 |
函数调用 |
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)打印输出
打印类型 |
使用方法 |
注意事项 |
|
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使用说明的更多相关文章
- awk使用说明(复制别人的)
来源:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 简介 awk是一个强大的文本分析工具,相对于grep的查找,se ...
- awk中printf的使用说明
printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息.在编写程序时经常会用到此函数.printf()函数的调用格式为: printf("", ); 其中 ...
- Linux的文本处理工具浅谈-awk sed grep
Linux的文本处理工具浅谈 awk 老大 [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS ...
- awk sed grep 详解
Linux的文本处理工具浅谈 awk [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS竖着切,列 ...
- linux命令之awk
简介 awk命令的名称是取自三位创始人Alfred Aho .Peter Weinberger 和 Brian Kernighan姓名的首字母,awk有自己的程序设计语言,设计简短的程序,读入文件,数 ...
- awk sed grep 常用命令
文本间隔 在每一行后面增加一空行: sed G sed G v1 >v2 在每一行后面增加两行空行: sed 'G;G' 将第一个脚本所产生的所有空行删除(即删除所有偶数行): sed 'n;d ...
- sed初理多行合并+sed之G、H、g、h使用+sed n/N使用说明
转载:[shell]sed处理多行合并 - seyjs - 博客园 (cnblogs.com) 文件格式 table=t1 name owner address table=t2 id text co ...
- Atitit.项目修改补丁打包工具 使用说明
Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...
- awk命令简介
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
随机推荐
- [APUE]UNIX进程的环境(上)
一. 前言 本章将学习:当执行程序时,其main函数是如何被调用的,命令行参数是如何传送给执行程序的,典型的存储器布局是什么样式,如何分配另外的存储空间,进程如何使用环境变量,进程终止的不同方式等.另 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(66)-MVC WebApi 用户验证 (2)
系列目录 前言: 回顾上一节,我们利用webapi简单的登录并进行了同域访问与跨域访问来获得Token,您可以跳转到上一节下载代码来一起动手. 继续上一篇的文章,我们接下来演示利用拿到的Token来访 ...
- 关于javascript中的this关键字
this是非常强大的一个关键字,但是如果你不了解它,可能很难正确的使用它. 下面我解释一下如果在事件处理中使用this. 首先我们讨论一下下面这个函数中的this关联到什么. function doS ...
- Object是什么
Object是什么 .Net程序员们每天都在和Object在打交道如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" ...
- 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】
前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...
- 使用CocosSharp制作一个游戏 - CocosSharp中文教程
注:本教程翻译自官方<Walkthrough - Building a game with CocosSharp>,官方教程有很多地方说的不够详细,或者代码不全,导致无法继续,本人在看了G ...
- 微信小程序新单位rpx与自适应布局
rpx是微信小程序新推出的一个单位,按官方的定义,rpx可以根据屏幕宽度进行自适应,在rpx出现之前,web页面的自适应布局已经有了多种解决方案,为什么微信还捣鼓出新的rpx单位?在解释这个单位前,我 ...
- 小谈Scrum敏捷开发流程
一晃眼,有两年没有写博客了,回顾前两年,各种奔波,各种忙碌,也有不少的收获.从今天开始,我要把这些收获都分享在这里. 其实这两年,对我影响最大的是开发流程.总所周知,一个好的开发流程,对于项目的进行, ...
- 实现ABP中Person类的权限功能
菜单项的显示功能已经完全OK了.那么我们就开始制作视图功能吧. 首先测试接口是否正常 我们通过代码生成器将权限和application中大部分功能已经实现了.那么我们来测试下这些接口ok不. 浏览/a ...
- 如何使用yum 下载 一个 package ?如何使用 yum install package 但是保留 rpm 格式的 package ? 或者又 如何通过yum 中已经安装的package 导出它,即yum导出rpm?
注意 RHEL5 和 RHEL6 的不同 How to use yum to download a package without installing it Solution Verified - ...