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的表达式;

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

3、print命令后面的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(格式);

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

3、printf语句不会自动打印换行符;\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^y和x**y:表示x的y次方

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 常见的模式类型:

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

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

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

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

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

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

实例:

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

1、Expressions 表达式

2、Control statements 控制状态

3、Compound statements 混合状态

4、Input statements  输入状态

5、Output statements  输出状态

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

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

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

模式匹配表达式:

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

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

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

七、控制语句:

7.1 if-else

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

例子:

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

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

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

3、awk -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]就加1,NF为当前匹配到的行的最后一个字段,此处用其值作为数组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 ,如需转载请自行联系原作者

Linux命令:文本处理工具awk详解相关推荐

  1. 文本处理工具AWK详解

    awk简介 awk: 中文意思是报告生成器 能够根据我们输入的信息,将信息格式化以后显示,将定义好的信息以比较美观(直观)的方式显示出来出现比较早,继而出现了new awk(nawk)在windows ...

  2. Linux文本编译工具VIM详解

    Linux文本编译工具VIM详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.VIM概述 1>.vim简介 1>.vi: 全称Visual editor,即文本编 ...

  3. linux xxx命令,linux命令ps aux|grep xxx详解

    对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大的进程查看命令. 使用该命令 可以确定有哪些进程正在运 ...

  4. linux命令ps -aux|grep xxx详解

    linux命令ps -aux|grep xxx详解 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大 ...

  5. Linux下暴力破解工具Hydra详解

    Linux下暴力破解工具Hydra详解 一.简介 Number one of the biggest security holes are passwords, as every password s ...

  6. Linux系统上hdparm工具参数详解,硬盘检查、测速、设定和优化

    Linux系统上hdparm工具参数详解,硬盘检查.测速.设定和优化 2012/07/25 hdparm, 硬盘 Linux命令相关 1 6,757 hdparm的功能:显示与设定硬盘的参数.hdpa ...

  7. Linux文本三剑客之一——awk详解(1)——awk看这两篇就够啦~PS:文末有练习,来练练手吧

    shell编程三剑客 grep --> egrep --> 文本过滤 查询 awk 文本截取 sed  文本的替换和修改 目录 awk awk也可以做小数运算 awk命令简要处理流程 aw ...

  8. Linux ❉ Vim文本编辑器及其应用详解

    一 介绍 很多人习惯将 Vim 称为 Vi,其实 Vim 是 Vi 的增强版(在 Vi 的基础上增加了正则表达式的查找.多窗口的编辑等功能),使用 Vim 进行程序开发会更加方便. 1 Vi和Vim的 ...

  9. 每天一个linux命令(2):文件权限详解

    Linux文件权限详解 文件和目录权限概述 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限:只允 ...

最新文章

  1. 【Python刷题】_2
  2. RHEL 6.3使用CentOS yum源 (redhat yum安装失败)
  3. com.sap.ui5.resource.ResourceServlet的工作原理介绍
  4. c语言mysql自动重连接_c++操作mysql数据库
  5. 关于MongoDB时区问题
  6. 二本 计算机专业2017分数线,2017体育二本分数线(2017体育生高考录取分数线)
  7. 中国分省市地图导航-SVG格式(基于Raphaël)
  8. python使用什么来体现代码之间的逻辑关系,Python使用缩进来体现代码之间的逻辑关系。...
  9. 中国矿业大学计算机学院进复试,拟录取名单陆续公布!初试第二败北,倒数第一逆袭!...
  10. 计算机更换桌面背景的步骤,怎么更换电脑桌面背景图片
  11. 在MAME里如何设置组合键
  12. 阿里巴巴第三财季营收1172.78亿元,同比增41%
  13. 传染病研究-靶向下一代宏基因组测序(mNGS)分析
  14. 消除ImageList 图片锯齿
  15. 8500万台安卓手机感染病毒,幕后黑手是一家中国公司
  16. lammps案例分析(1):石墨烯单轴拉伸之velocity方式
  17. 王建伟c语言入门,C语言【共43课时】_C/C++/C#课程-51CTO学院
  18. 通过FTP以及SMB实现电脑,手机,ipad的文件同步访问
  19. openCV专栏(五):形态学操作+梯度算子
  20. bootstrap 英文日历_时间日期日历控件(bootstrap-datetimepicker)

热门文章

  1. 二维码Aztec简介及其解码实现(zxing-cpp)
  2. 云计算机机房怎么样,如何知道云电脑配置多少?怎么选择云电脑机房?
  3. java udp tcp协议_【java】TCP和UDP传输协议
  4. websocket心跳链接代码_WebSocket原理与实践(五)--心跳及重连机制
  5. linux esd转iso,window_Win10 TH2正式版10586官方ESD映像怎么转换成ISO镜像?,今天phpstudy分享了Win10 TH2(Build - phpStudy...
  6. iOS 三种类型的Block
  7. (转)如何修改maven的默认jdk版本
  8. Linux中断(interrupt)子系统之一:中断系统基本原理【转】
  9. C#从SQL server数据库中读取l图片和存入图片
  10. 深入Java虚拟机之虚拟机体系结构