报告生成器-awk命令

简介:

AWK是一个优良的文本处理工具,LinuxUnix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk )

格式:

awk [options] 'script' file1 file2,...

awk [options] 'PATTERN {action}' file1 file2,...

    print,printf

awk的输出:

一、print

print的使用格式:

    print item1,item2,...

要点:

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

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

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

 例子:

    #awk 'BEGIN {print "line one\nline two\nline three"}'

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

二、awk变量

  1. awk内置变量之记录变量:

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

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

    OFS:Output Filed Separator

    ORS:Output Row Separator

  2. awk内置变量之数据变量:

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

    NF:Number of Field,当前记录的field个数;

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

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

    ARGC:awk命令的参数的个数;

    FILENAME:awk命令所处理的文件个数;

    ENVIRON:当前shell环境变量及其值得关联数组;

    如:awk 'BEGIN{print ENviron["PATH"]}'

  3. 用户自定义变量

    gawk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,且不能以数字开头。gawk变量名称区分字符大小写。

    1)在脚本中赋值变量

     在gawk中给变量赋值使用赋值语句进行,例如:

     awk 'BEGIN {var="variable testing";print var}'

    2)在命令行中使用赋值变量

   gwak命令也可以在“脚本”外为变量赋值,并在脚本中引用。例如,上述的例子还可以改写为:

   awk -v var="variable testing" 'BEGIN{print var}'

三、printf

printf命令的使用格式:

printf format,item1,item2,...

要点:

  1. 其与print命令的最大不同是,printf需要指定format;

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

  3. printf语句不会自动打印换行符;\n

format格式的指示符都以%开头,后跟一个字符;如下:

%c:显示字符的ASCII码;

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

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

%f:显示浮点数;

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

%s:显示字符串;

%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/sdtout:标准输出

/dev/stderr:错误输出

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

例子:

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


六、awk的操作符:

1. 算术操作符:

-x: 负值

+x: 转换为数值;

x^y: 

x**y: 次方

x*y: 乘法

x/y:除法

x+y:

x-y:

x%y:

2. 字符串操作符:

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

3. 赋值操作符:

=

+=

-=

*=

/=

%=

^=

**=

++

--

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

4. 布尔值

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

5. 比较操作符:

x < yTrue if x is less than y. 

x <= yTrue if x is less than or equal to y. 

x > yTrue if x is greater than y. 

x >= yTrue if x is greater than or equal to y. 

x == yTrue if x is equal to y. 

x != yTrue if x is not equal to y. 

x ~ yTrue if the string x matches the regexp denoted by y. 

x !~ yTrue if the string x does not match the regexp denoted by y. 

subscript in array  True if the array array has an element with the subscript subscript

7. 表达式间的逻辑关系符:

&&

||

8. 条件表达式:

selector?if-true-exp:if-false-exp

if selector; then

  if-true-exp

else

  if-false-exp

fi

a=3

b=4

a>b?a is max:b ia max

9. 函数调用:

function_name (para1,para2)

七、awk的模式:

awk 'program' input-file1 input-file2 ...

其中的program为:

pattern {action}

pattern {action}

...

  1. 常见的模式类型:

    1)Regexp:正则表达式,格式为/regular expression/

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

    3)Ranges:指定的匹配范围,格式为pat1,pat2

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

    5)Empty(空模式):匹配任意输入行;

  2. 常见的Action

    1)Expressions:

    2)Control statements

    3)Compound statements

    4)Input statements

    5)Output statements


/正则表达式/:使用通配符的扩展集

关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。

模式匹配表达式:

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

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

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


八、控制语句

  1)if-else

    语法:if (condition) {then-body} else {[else-body]}

    例子:

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

    awk -F: '{if ($1=="root") printf "%-15s: %s\n", $1,"Admin"; else printf "%-15s: %s\n", $1, "Common User"}' /etc/passwd

    awk -F: -v sum=0 '{if ($3>=500) sum++}END{print sum}' /etc/passwd

  2)while

    语法:while (condition) {statement1; statement2;...

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

    awk -F: '{i=1;while (i<=NF) { if (length($i)>=4) {print $i}; i++ }}' /etc/passwd

  3)do-while

    语法:do {statement1,statement2,...} while (condition)

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

  4)for

    语法:for (cariable assignment;condition;iteration process){statement1,statement2,..}

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

    awk -F: '{for(i=1;i<=NF;i++) { if (length($i)>=4) {print $i}}}' /etc/passwd

for循环还可以用来遍历数组元素:

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

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

  5)case

    语法:switch (expression) {case VALUE or /REGEXP/: statement1,statement2,... default:statement1,...}

  6)break 和 continue

    常用于循环或case语句中

  7)next

    提前结束对本行文本的处理,并接着处理下一行;例如,下面的命令将显示其ID号为奇数的用户

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

九、awk中使用数组

  1. 数组

    array[index-expression]

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

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

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

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

例子:

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

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


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

用法与上一个例子相同,用于统计某日志文件中IP地的访问量

2.删除数组变量

从关系数组中删除数组索引需要使用delete命令。使用格式为:

delete array[index]


十、awk的内置函数

split(string,arrary [ ,gieldsep[, seps ] })

功能:将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结构保存至array为名的数组中;数组下标为从0开始的序列;

netstat -ant | awk '/:80\>/{split($5,clients,":");IP[clients[1]]++}END{for(i in IP){print IP[i],i}}' | sort -rn | head -50

length([string])

功能:返回string字符串中字符的个数;

substr(string, start [, length])

功能:取string字符串中的子串,从start开始,取length个;start从1开始计数;

system(command)

功能:执行系统command并将结果返回至awk命令

systime()

功能:取系统当前时间

tolower(s)

功能:将s中的所有字母转为小写

toupper(s)

功能:将s中的所有字母转为大写

十一、用户自定义函数

自定义函数使用funciton关键字。格式如下:

function F_NAME([variable])

{

statements

}

函数还可以使用return语句返回值,格式为“return value”。










本文转自 SoulMio 51CTO博客,原文链接:http://blog.51cto.com/bovin/1841168,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
Unix Java Linux
Linux脚本中的字符处理与awk编程|WC统计
Linux脚本中的字符处理与awk编程|WC统计
48 0
|
8月前
去除txt文件空行批处理程序
刚好遇到一个需要去除txt文件空行的问题,就做了一个批处理bat程序来操作,挺方便,附上来给大家分享一下
258 0
|
2月前
|
Perl
awk复杂用法模式匹配与动作
awk复杂用法模式匹配与动作
31 2
|
4月前
|
Shell
|
10月前
|
运维 Shell
善用chatGPT学习 | bash脚本如何判断字符串在数组中
善用chatGPT学习 | bash脚本如何判断字符串在数组中
147 0
|
11月前
|
分布式计算
编写一个简单的程序,实现以下功能:统计文本文件中出现的单词的个数
编写一个简单的程序,实现以下功能:统计文本文件中出现的单词的个数
132 0
|
缓存 Shell 开发工具
Shell脚本编程实践——第4关:编写一个脚本,计算txt文件中每一行单词的个数并将结果写入另一个文件
Shell脚本编程实践——第4关:编写一个脚本,计算txt文件中每一行单词的个数并将结果写入另一个文件
827 0
|
SQL 自然语言处理 前端开发
wc 统计已过时,cloc 每一行代码都有效
我们通常用代码量来评判一个程序员技术的高低或一个项目的大小,阅读新项目源码时,也需要了解其代码量,心里有个预期。那如何统计代码量呢?
wc 统计已过时,cloc 每一行代码都有效
|
Perl
使用 awk 命令统计文本
下面只是在工作中可能会遇到的一个场景,所以记录下来,如果小伙伴有更合适的方式来统计计算,欢迎留言。
211 0
|
Web App开发 网络协议 Unix
Linux-文本处理三剑客awk详解+企业真实案例(变量、正则、条件判断、循环、数组、分析日志)
文本处理 awk 1.awk简介 awk是一种编程语言,用于在Linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其他命令的输出,它支持用户自定义函数和动态正则正则表达式等先进功能,是Linux/unix下的一个强大的编程工具。它在命令行中使用,但更多是作为脚本来使用。
441 0
Linux-文本处理三剑客awk详解+企业真实案例(变量、正则、条件判断、循环、数组、分析日志)