awk应用

一、awk格式和选项

awk [options] 'script' var=value file(s)
awk [options] "PATTRN {'aciton'}" file(s)

常用命令选项

-F fs   fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:

-v var=value   赋值一个用户定义变量,将外部变量传递给awk

-f scripfile  从脚本文件中读取awk命令

-m[fr] val   对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

二、awk的模式(PATTERN)

awk 'program' input-file1 input-file2

其中program为:

pattern{action}

pattern{action}

(一)常见的模式类型

  1、正则表达式:格式为/regular expression/

2、表达式:其值非0或非空字符串时满足条件,如:$1 ~/foo/ ,用运算符~(匹配)和~!(不匹配)

3、范围:指定匹配范围,格式:awk -F '/^r/,/^m/{print $1,$2}' /etc/passwd 以r开头到m开头截止

4、BEGIN/END:特殊模式,仅在awk命令前运行一次或结束前运行一次

5、空模式:匹配任何数行

(二)常见的action

1、表达式,判断表达式等

2、控制语句(if,for等)

3、复合语句:重定向到其他文件

4、输入输出语句

三、awk的输出

(一)print输出

格式:print item1,item2 ,...

要点:

1、各项目之间用逗号隔开,而输出时则以空白字符分隔;

2、输出的item可以是字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会转换为字符串再输出;

3、print命令后面的item可以省略,此时相当于 print $0;如果想输出空白行,则需使用print "";

例子:

#awk 'BEGIN{print "how are you"}'

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

分析:print中的$0表示自己,$1表示awk切分的片为第1片,$2为第2片。

(二) awk变量

2.1、awk内置变量之记录变量

  FS:读取文档时,所使用的字段分隔符,默认为空白字符。

  OFS:打印输出时,所使用的字段分隔符,默认为空白字符。

  RS:输入文本信息时所使用的换行符,默认是"\n"

  ORS:打印输出时所使用的换行符,默认是"\n"

例子:

awk 'BEGIN(OFS="\t")'{print $1 ,$2} /etc/passwd

2.2、awk内置变量之数据的变量

NR:命令所处理的记录数:如果有多个文件,这个数目会把处理的多个文件中行统一计数;

FNR:与NR不同的是,FNR用于记录正处理的行,是当前这一文件中总共处理的行数;

NF:当前记录的字段个数

ARGV:数组,保存命令本身这个字符串;

如:awk '{print $0}' a.txt b.txt 这个命令中,ARGV[0]保存awk,ASGV[1]保存a.txt

ARGC: awk命令的参数个数

FILENAME: awk命令所处理的文件名称

ENVIRCN:当前shell环境变量及值的关联数组

如:awk 'ENGIN{print ENVIRCN["PATH"]}'

2.3、用户自定义变量

awk允许用户自定义自己的变量在程序代码中使用,变量名规则是只能使用字母、数字和下滑线,数字不能开头。区分大小写。

2.3.1   在脚本中赋值变量

在awk中给变量赋值:

例:

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

2.3.2 在命令行中使用赋值变量

awk可以在"脚本"外为变量赋值,并在脚本中引用。例如:上述可改为:

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

四、printf格式输出

printf命令使用格式:

printf format ,item1,item2,..

要点:

1、printf 需要指定format(格式);

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

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

format格式指示符(以%开头后跟一个字符):

%c:显示字符

%s:显示字符串

%d,%i:十进制数

%e,%E:科学计数法

%f:浮点数

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

 %u:无符号整数

%%:显示自身

修饰符:

N:显示宽度

-:左对齐,默认是右对齐

+:显示数值符号

例子:

awk -F: '{printf "%-15s %i\n",$1,$3}' /etc/passwd

五、输出重定向

print items > output-file

print items > output-file

print items | command

特殊文件描述符:

/dev/stdin: 标准输入

/dev/stdout:标准输出

/dev/stderr:错误输出

/dev/fd/N:某特定文件描述符,如/dev/stdin 就相当于/dev/fd/0

例子:

awk -F:'{printf "%15s %i\n",$1,$2 >"/dev/sderr"}' /etc/passwd

六、awk的操作符

注意:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。

七、数组

  (一)、数组的定义

array[index-expression]

1、数字做数组下标

      Arr[1]="sun"
      Arr[2]="uu"

2、字符串做数组下标

      Array["first"]="www"
      Array["last"]="name"
      Array["birth"]="1987"

index-expression可以是任意字符串,需要注意的是如果某数据组元素事先不存在,那么在其引用时,awk会自动创建次元素并初始化为空字符串,因此要判断某数据组中使用index in array方式

要遍历数组中每一个元素,需要使用如下结构:

for (var in arrar) {statement1,...}

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

例子:

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

每出现一次/^tcp/模式匹配到的行,数组S[$NS]就加1,NF为当前行的最后一个字段,此处用其值作为数组S的元素索引;

awk '{counts[$1]++}END {for(url in counts) print counts[url],url}'  /var/log/httpd/access_log

(二)删除数组

  delete array[key]

     可以删除,对应数组key的,序列值。

例:

  awk 'BEGIN{t1["a"]="a",t1["b"]="b"} delete t1["a"] END{for(k in t1) print t1,t1[k]}'

八、流程控制语句

每条命令语句后面可以用;分号结尾。

条件判断语句

if(表达式)
{语句1}
else if(表达式)
{语句2}
else
{语句3}

例子:

awk 'BEGIN{ test=100;
if(test>90)
{ print "very good";
}
else if(test>60)
{ print "good"; }
else
{ print "no pass";
}
}'

  循环语句

while语句

while(表达式)
{语句}

例子:

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

for循环

for循环有两种格式:

格式1

for(变量 in 数组)
{语句}

例1:

awk 'BEGIN{
name[1]="aa",
name[2]="bb"
}
END{
for (k in name){
print name[k],k
}
}'

例2

awk 'BEGIN{
for(k in ENVIRON){
print k"="ENVIRON[k];
} }' TERM=linux
G_BROKEN_FILENAMES=1
SHLVL=1 pwd=/root/text
...
logname=root
HOME=/root
SSH_CLIENT=192.168.1.21 53087 22

注:ENVIRON是awk常量,是子典型数组。

格式2:

for(变量;条件;表达式)
{语句}

例:

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

do循环

do {语句}
while(条件)

例:

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

其他语句

break 当 break 语句用于 while 或 for 语句时,导致退出程序循环。

continue 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。

next 能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。

exit 语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。

更多:http://man.linuxde.net/awk#awk命令格式和选项

awk应用的更多相关文章

  1. awk命令简介

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

  2. awk使用说明

    原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...

  3. 3.awk数组详解及企业实战案例

    awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...

  4. shell——awk

    awk -F"分隔符" "command" filename awk -F":" '{print $1}' /etc/passwd 字段引用 ...

  5. 【Linux】AWK入门

    什么是AWK AWK是一种用于处理文本的编程语言工具,一个模式匹配程序.一个典型的示例是将数据转换成格式化的报告. 在命令行输入如下awk命令: awk -F":" '{ prin ...

  6. 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od

    awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk ''  | output 1.首先要知道形式 awk 'command' fi ...

  7. sed awk grep三剑客常用

    sed的常用用法: awk的常用用法: grep的常用用法: 除了列出符合行之外,并且列出后10行. grep -A 10 Exception kzfinance-front.log 除了列出符合行之 ...

  8. awk命令速查

    awk与sed.grep一样都是为了加工数据流而做成的文本加工过滤器命令.awk会事先把输入的数据根据字段单位进行分割.在没有制定分割单位的情况下,以输入数据中的空格或Tab为分隔符.与sed相比,它 ...

  9. Sed、Awk单行脚本快速参考

    文本间隔: # 在每一行后面增加一空行 sed G awk '{printf("%s\n\n",$0)}' # 将原来的所有空行删除并在每一行后面增加一空行. # 这样在输出的文本 ...

随机推荐

  1. ubuntu下配置vimtab空格数

    vim ~/.vimrc  没有就创建 set tabstop=4 //4就是4个空格

  2. Spring代理模式及AOP基本术语

    一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...

  3. 我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗

    文章背景,回答提问:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗? 我的建议是这样:1. 不要辞职.首先说,你对整个开发没有一个简单的了解,或一个系统的入门学习.换句 ...

  4. 【腾讯Bugly干货分享】基于RxJava的一种MVP实现

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bfef673c1174283d60bac0 Dev Club 是一个交流移动 ...

  5. Java线程池解析

    Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...

  6. 如何在腾讯开放平台的云服务器上安装php和memcache 一

    由于被通知腾讯的CEE要关闭了,必须自己切换到服务器,自己装php.烦到一个B. 首先找到官方wiki: http://wiki.qcloud.com/wiki/SUSE%E7%8E%AF%E5%A2 ...

  7. ABP源码分析二十八:ABP.MemoryDB

    这个模块简单,且无实际作用.一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍),一般用了数据库 ...

  8. C# - 缓存OutputCache(二)缓存详细介绍

    本文是通过网上&个人总结的 1.缓存介绍 缓存是为了提高访问速度,而做的技术. 缓存主要有以下几类:1)客户端缓存Client Caching 2)代理缓存Proxy Caching 3)方向 ...

  9. 搭建一个简单的mybatis框架

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  10. 工作笔记--哪些bug应由研发发现?

      标准: 研发应发现: 主功能流程无法正常使用,以及联调时主功能流程是否正常 功能缺失 打包时数据库表非最新.程序文件非最新: 文件导出时有明显错误(如无法导出.导出后格式明显不对.批量导入出错) ...