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. Xamarin.Android-捕获未处理异常(全局异常)

    一.前言 android中如果出现了未处理的异常,程序会闪退,这是非常不好的用户体验,很多用户会因此卸载APP,因此未处理的异常是应该尽力避免的. 有些很难避免的异常(如:IO.网络等),应在代码中进 ...

  2. 一步步开发自己的博客 .NET版(9、从model first替换成code first 问题记录)

    为什么要改用code first 用过code first的基本上都不会再想用回model first或是db first(谁用谁知道).不要问我为什么不一开始就直接使用code first,因为那个 ...

  3. web前端的春天 or 噩梦

    「 微信应用号可以做什么」 简单说,微信"小程序"可以为开发者提供基于微信的表单.导航.地图.媒体和位置等开发组件,让他们在微信的网页里构建一个 HTML 5 应用.同时微信还开放 ...

  4. 【完全开源】知乎日报UWP版(下篇):商店APP、github源码、功能说明。Windows APP 良心出品。

    目录 说明 功能 截图+视频 关于源码和声明 说明 陆陆续续大概花了一个月的时间,APP算是基本完成了.12月份一直在外出差,在出差期间进行了两次功能完善,然后断断续续修补了一些bug,到目前为止,我 ...

  5. ABP(现代ASP.NET样板开发框架)系列之1、ABP总体介绍

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之1.ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  6. 【原】关于Python中setuptools安装的问题

    在生成package的时候,需要在setup.py中引入setuptools包,可是却报告如下错误: ImportError: No module named setuptools 解决办法就是下载s ...

  7. Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结

    Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码  用户操作 ,比如 ...

  8. EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  9. 深入分析Spring 与 Spring MVC容器

    1 Spring MVC WEB配置 Spring Framework本身没有Web功能,Spring MVC使用WebApplicationContext类扩展ApplicationContext, ...

  10. c 算牌器代码

    int main() { // 算牌器 ]; ; do { printf("请输入牌名: \n"); scanf("%2s",char_name); ; ]) ...