Linux命令:文本处理工具awk详解

简介:

awk命令简介:

       awk是一个强大的文本分析工具,通常,awk是以文件的每一行,为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

 

 1.命令格式:

  awk 'pattern {action}'{filenames}

     其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所

执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的

模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

    调用awk有几种方式:

         命令行方式:

     awk  [-Ffield-separator] 'commands' input-file(s)

    其中,commands awk的处理命令,-F 表示区域分隔符是可选项。input-file(s) 

是需要处理的文本文件。在awk中,文件的每一行中,由区域分隔符分开的每一项称为

一个区域。通常,在不指定-F区域分隔符的情况下,默认的区域分隔符是空格。

         shell脚本方式:

      将所有的awk命令插入一个文件,并使用awk程序可执行,然后awk命令解释器作为

脚本的首行,以便通过键入脚本名称来调用。相当于shell脚本首行的:#!/bin/bash可以

换成:#!/bin/awk3.将所有的awk命令插入一个单独文件,然后调用:

awk -fawk-script-file input-file(s) 其中,-f选项:加载awk-script-file中的awk脚本,

input-file(s):是需要处理的文本文件.

     2.命令功能:

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

3.命令参数:

·        -F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:

·        -v var=value or --asign var=value
赋值一个用户定义变量。

·        -f scripfile or --file scriptfile
从脚本文件中读取awk命令。

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

·        -W compact or --compat, -W traditional or --traditional
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

·        -W copyleft or --copyleft, -W copyright or --copyright
打印简短的版权信息。

·        -W help or --help, -W usage or --usage
打印全部awk选项和每个选项的简短说明。

·        -W lint or --lint
打印不能向传统unix平台移植的结构的警告。

·        -W lint-old or --lint-old
打印关于不能向传统unix平台移植的结构的警告。

·        -W posix
打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符****=不能代替^^=fflush无效。

·        -W re-interval or --re-inerval
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]

·        -W source program-text or --source program-text
使用program-text作为源代码,可与-f命令混用。

·        -W version or --version
打印bug报告信息的版本。

·         

   4.awk的输出

  一、print

    print的使用格式:

      print item1,item2,....

  要点:

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

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

     数值会先转换成字符串,而后再输出;

   3print命令后面的item可以省略,此时其功能相当于print $0 ($0显示所有字段),因此,

     如果想输出空白行,则需要使用print"";

 例子:

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

 awk -F: '{ print $1,$2 }' /etc/passwd     -F指定分隔符为:

  

  二、awk变量

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

   FS: field separator,指定读取文本时,所使用字段分隔符,默认是空白字符;

   RS: Record separator;指定输入文本信息所使用的换行符,默认是换行符;

   OFS: Output Filed separator;指定输出字段分隔符;

   ORS: Output Row Separator; 指定输出行分隔符;

  2.2 awk内置变量之数据变量;

   NR:awk命令所处理的行数;如果有多个文件,则会统计显示每一个文件所处理的行数;

   NF:统计当前处理的行的字段个数

   FNR:NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数,仅针对正在处       理的文件,NR是针对所有处理过的文件。

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

      ARGV[0]保存awk,ARGV[1]保存a.txt

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

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

     如:awk 'BEGIN{printENVIRON["PATH"]}'

  2.3 用户自定义变量

     awk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程

  语言相通,只能使用字母、数字和下划线,且不能以数字开头,awk变量名称区分字符大小写。

    2.3.1 在脚本中赋值变量

      awk中给变量赋值使用赋值语句进行;例如:

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

[root@mail~]# awk'BEGIN{var="variable testing"; print var}'

variabletesting

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

      awk命令也可以在脚本外为变量赋值,并在脚本中进行引用,例如,上述的例子

      还可以改写为 awk -v var="variabletesting" 'BEGIN{print var}'           

[root@mail~]# awk -v var="variable testing" 'BEGIN{print var}'

variabletesting

 

   三、printf

    printf命令的使用格式:

    printf format, item1,item2,...

 要点:

  1、其与print命令的最大不同是,printf需要制定format(格式);

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

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

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

  %c: 显示字符的ASCII码;

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

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

  %f:显示浮点数;

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

  %s:显示字符串;

  %u:无符号整数;

  %%:显示%自身;

 

 修饰符:

  N:显示宽度;(N为数字,表示字符间的间距多宽)

  -:左对齐(默认不加-表示右对齐)

  +:显示数值符号;

例子:

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

[root@mail~]# awk -F: '{printf "%-15s %i\n",$1,$3}' /etc/passwd

root           0

bin            1

daemon         2

adm            3

 

 四、输出重定向

 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

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

root           0

bin            1

daemon         2

adm            3

lp             4

 

 五、awk的操作符:

  5.1 算术操作符;

   -x:负值

   +x:转换为数值;

   x^yx**y:表示xy次方

   x*y:乘法

   x/y:除法

   x+y:加法

   x-y:减法

   x%y:取余

  5.2 字符串操作符:

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

  5.3 赋值操作符;

  = += -= *= /= %= ^= **= ++ --

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

  5.4 布尔值

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

  5.5 比较操作符:

  x < y  true if x is less than y

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

  x > y  true if x is greater than y.

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

  x == y  true if x is equal to y.

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

  x ~ y  true if the string x matches the regexp denoted by y.(x为字符,y为匹配模式,

        如果x字符能被y匹配到,就返回真)

  x !~ y  true (x为字符,y为匹配模式,如果x字符不能被y匹配到,就返回真)

  5.6表达式间的逻辑关系符:

   && 逻辑与  || 逻辑或

  5.7 条件表达式:

   if selector; then 

     if-true-exp

   else

     if-false-exp

   fi

  5.8 函数调用:

   function_name (para1,para2)

 

  六、awk的模式

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

  其中的program为:

   pattern { action }

   pattern { action }

   ...

  6.1 常见的模式类型:

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

   2expression:表达式,其值非0或为非空字符时满足条件,如:$1 ~ /foo/ 

    $1 == "magedu",用运算符~(匹配)!~(不匹配)

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

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

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

 实例:

  awk -F: '/^r/{print $1}' /etc/passwd  显示/etc/passwd文件中首字母为r的行的第一个字段

  awk -F: '$3>=500{print $1,$3}' /etc/passwd 显示/etc/passwd文件中第三个字段的值大于

     等于500的行的第1和第三个字段

  awk -F: '$7~"bash$"{print $1,$7}' /etc/passwd  显示/etc/passwd文件中第9个字段匹配到

      行尾是bash的行的第一和第7个字段

   awk -F:'$3==0,$7~"nologin" {print $1,$3,$7}' /etc/passwd 显示/etc/passwd文件中,

     第一次$3的值等于0$7匹配到nologin范围内的行的第1,3,7字段。

[root@mail~]# awk -F: '$3==0,$7~"nologin" {print $1,$3,$7}' /etc/passwd

root0 /bin/bash

bin1 /sbin/nologin

[root@mail~]# awk -F: 'BEGIN{print "Usename    ID    Shell"}$3==0,$7~"nologin"{printf"%-10s%-10s%-20s\n",$1,$3,$7}' /etc/passwd  #在打印显示前先打印显示BEGIN的内容

Usename   ID    Shell

root     0         /bin/bash          

bin      1         /sbin/nologin    

[root@mail~]# awk -F: 'BEGIN{print "Usename    ID    Shell"}$3==0,$7~"nologin"{printf"%-10s%-10s%-20s\n",$1,$3,$7}END {print "End of report"}'/etc/passwd  #在打印显示前先打印显示BEGIN的内容且在打印显示结束后显示END的内容

Usename   ID    Shell

root     0         /bin/bash          

bin      1         /sbin/nologin      

End ofreport

 

  6.2 常见的Action

   1Expressions 表达式

   2Control statements 控制状态

   3Compound statements 混合状态

   4Input statements  输入状态

   5Output statements  输出状态

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

   关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,

   $2>$1选择算二个字段比第一个字段长的行。

   模式匹配表达式:

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

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

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

七、控制语句:

  7.1 if-else

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

   例子:

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

 2awk -F'{if($1=="root") printf "%-15s: %s\n",$1,"Admin";else printf "%-15s:

 %s\n",$1,"CommonUser" }' /etc/passwd

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

  7.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

  7.3 do-while

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

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

  7.4 for

  语法:for (variable assignment;condition; iteration process)

      {statement1,statement2,...}

  awk -F: '{for(i=1;i<=3;i++) 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

  7.5 case

  语法:switch (expression) {caseVALUE or /REGEXP/: 

      statement1,statement2,...default:statement1,...}

  7.6 break  continue

   常用于循环或case语句中

  7.7 next

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

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

 

 八、 awk中使用数组

8.1 数组

   array[index-expression]

   index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不存在,那么

   在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某

   元素,需要使用index in array的方式;

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

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

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

   例子:

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

{print S,STATE[S]}}'

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

    awk '{counts[$1]++}END {for(url in counts)print counts[url],url}' 

   /var/log/httpd/access_log

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

   8.2 删除数组变量

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

   delete array[index]

 














本文转自wang650108151CTO博客,原文链接:http://blog.51cto.com/woyaoxuelinux/1945750 ,如需转载请自行联系原作者


相关文章
|
4天前
|
监控 Unix Linux
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
14 0
|
5天前
|
Web App开发 Linux 网络安全
工作中常用到的Linux命令
工作中常用到的Linux命令
|
5天前
|
Web App开发 Java Linux
Linux之Shell基本命令篇
Linux之Shell基本命令篇
Linux之Shell基本命令篇
|
6天前
|
Linux Perl
Linux|从 STDIN 读取 Awk 输入
Linux|从 STDIN 读取 Awk 输入
19 4
|
4天前
|
Linux
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
10 0
|
2天前
|
NoSQL Linux Shell
常用的 Linux 命令
常用的 Linux 命令
23 9
|
1天前
|
缓存 运维 监控
Linux系统监控利器:探索常用命令及数据保存技巧
Linux系统监控利器:探索常用命令及数据保存技巧
19 4
Linux系统监控利器:探索常用命令及数据保存技巧
|
4天前
|
Linux 索引
linux 文件查找 和文件管理常用命令
linux 文件查找 和文件管理常用命令
15 0
|
4天前
|
安全 Unix Linux
一、linux 常用命令之 linux版本信息 系统管理与设置 持续更新******
一、linux 常用命令之 linux版本信息 系统管理与设置 持续更新******
13 0
|
6天前
|
Prometheus 监控 Cloud Native
【Linux】查看系统内存命令(详细讲解)
【Linux】查看系统内存命令(详细讲解)