2016年7月27日星期三

Linux_109:常用命令之三十五:awk

awk 是一个强大的文本分析工具,它逐行的读入文件,按分隔符抽取每行的信息片段,再进行各种分析处理。
awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0 表示所有域,$1 表示第 1 个域,$n 表 示第 n 个域。
默认域分隔符是空格键 或 tab 键。

1. 命令语法:awk '{pattern + action}' {filenames}
(1)pattern 是根据正则表达式要查找的内容。
(2)action 是在找到匹配内容时所执行的一系列命令。
(3)大括号不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

2. 使用方式

2.1 命令行方式
awk [-F  field-separator]  'commands'  input-file(s)
(1)commands 是 awk 命令。
(2)-F field-separator 是域分隔符,不指定的话,默认是空格。
(3)input-file(s) 是待处理的文件。

2.2 shell 脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh 可以换成:#!/bin/awk

2.3 文件方式
awk -f awk-script-file input-file(s)
(1)-f awk-script-file 是 awk 脚本文件。
(2)input-file(s) 是待处理的文件。

3. 内置变量
(1)ARGC 命令行参数个数
(2)ARGV 命令行参数排列
(3)ENVIRON 支持队列中系统环境变量的使用
(4)FILENAME 浏览的文件名
(5)FNR 浏览文件的记录数
(6)FS 设置输入域分隔符,等价于命令行 -F 选项
(7)NF 浏览记录的域的个数
(8)NR 已读的记录数
(9)OFS  输出域分隔符
(10)ORS  输出记录分隔符
(11)RS 控制记录分隔符

4. 例子
(1)只显示 /etc/passwd 的账户名称
# cat /etc/passwd | awk  -F ':'  '{print $1}'
这里的 $1表示登录用户,$3 表示登录用户IP,以此类推。
(2)只显示/etc/passwd 的账户和账户对应的 shell,并且账户和 shell 之间以 tab 键间隔。
# cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
(3)只显示/etc/passwd 的账户和账户对应的 shell,并且账户和 shell 之间以逗号间隔,而且在所有行添加列名 name、shell,在最后一行添加 "blue,/bin/nosh"。
# cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
(4)搜索 /etc/passwd 中以 root 开头的所有行
# awk -F: '/^root/' /etc/passwd
(5)统计 /etc/passwd 的文件名,每行的行号,每行的列数,对应的完整行内容:
# awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
# awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

5. 编程

参考文献:
1. http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

没有评论: