欢迎各位来投稿,投稿邮箱 admin@veimx.com 欢迎各位爱好PHP,linux的朋友们加入我们

AWK的简介和应用

Linux spade 549℃ 0评论

20161008171726

Awk

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

awk特点

AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
最简单地说, AWK 是一种用于处理文本的编程语言工具。AWK 在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法。它的设计思想来源于 SNOBOL4 、sed 、Marc Rochkind设计的有效性语言、语言工具 yacc 和 lex ,当然还从 C 语言中获取了一些优秀的思想。在最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。
尽管操作可能会很复杂,但命令的语法始终是:
awk ‘{pattern + action}’ 或者 awk ‘pattern {action}’
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
gawk 是 AWK 的 GNU 版本。
一般的UNIX作业系统,本身即附有AWK,不同的UNIX作业系统所附的AWK其版本亦不尽相同,若读者所使用的系统上未附有AWK,可通过 anonymous ftp 到下列地方取得:
phi./pub/gnu
ftp/UNIX/gnu
preppub/gnu
注 解:一种编程语言,因其模式匹配语法而特别有用,通常用于数据检索和数据转换。一个GNU版本称为Gawk。

awk的应用

特殊字段:

BEGIN语句设置计数和打印头部信息,在任何动作之前进行。

END语句输出统计结果,在完成动作之后执行。

分隔符默认是空格,可以用-F, 改变成逗号为分隔符 -F,  或改成冒号 -F:

[root@spade ~]# rpm -qa | grep awk
gawk-3.1.7-10.el6.x86_64

例1.获取当前主机指定网卡的ip地址

20161008172045
[root@spade ~]# ifconfig eth0 | grep 'inet addr:' | grep 'Bcast:' | awk -F: '{print $2}' | awk '{print $1}'
192.168.1.3

例2:打印出passwd中用户UID大于1000的用户名和登录shell

[root@spade ~]# cat /etc/passwd | awk -F: 'BEGIN{print "user" "\t" "shell"} $3 >= 500 {print $1 "\t" $7}'
user shell
nfsnobody /sbin/nologin
swk /bin/bash
zbj /bin/bash
例3:打印当前内存使用的百分比
[root@spade ~]# free -m
20161008173157
20161008173555
[root@spade ~]# free -m | grep 'Mem:' | awk '{print "当前内存已用:" "\t" $3*100/$2"%"}'
当前内存已用: 18.1205%

awk高级应用

命令格式

awk [-F | -f | -v ] ‘BEGIN {} // {command1;command2} END {}’file

F 指定分隔符

-f 调用脚本

-v 定义变量

引用代码块

BEGIN 初始化代码块

// 匹配代码块,可以是字符串正则表达式

{} 命令代码块,包含一条或多条命令

多条命令使用分号分隔

END 结尾代码块

 

特殊用法:

$0           表示整个当前行

NF           字段数量变量

NR           每行的记录号,多文件记录递增

\t           制表符

\n           换行符

~             匹配,与==相比不是精确比较

!~           不匹配,不精确比较

-F'[:#/]’   定义三个分隔符

 

 



转载请注明:巴蜀风博客-个人爱好博客-你的私人博客 » AWK的简介和应用

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情