(一) 什么是AWK?
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk
最简单地说, AWK 是一种用于处理文本的编程语言工具。AWK 在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法。它的设计思想来源于 SNOBOL4 、sed 、Marc Rochkind设计的有效性语言、语言工具 yacc 和 lex ,当然还从 C 语言中获取了一些优秀的思想。在最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。
(二) AWK使用方式
尽管操作可能会很复杂,但命令的语法始终是:
awk [options] 'commands' filenames
awk [options] -f awk-script-file filenames
或:
awk '{pattern + action}' 或者 awk 'pattern {action}'
= = options:
-F 定义输入字段分隔符,默认的分割符是空格或制表符
== command(可以是模式,也可以是动作,也可以是模式+动作;;其中模式可以是正则也可以是条件测试还可以是其它)
BEGIN{} {} END{}
行处理前(第一行处理前,不是每一行。) 行处理 行处理后(所有行处理后不是一行处理后)
在行处理之前定义输入分割符FS:
OFS是 out FS ,输出分割符:
OFS和FS是awk的内置变量
command中模式详解:
范围模式是从哪到哪,从Tom到Suzanne 这个范围
(三) AWK的一些简单用法
1. awk 'pattern' filename 如 awk '/root/' passwd 模式 ###没有指定动作相当于匹配查找,把汉root的行打印在屏幕上。
2. awk '{action}' filename 如 awk -F: '{print $1} ' passwd 动作 ### 打印:分割的第一列
3. awk 'pattern {action}' filename 如 awk -F: ‘/root/ {print $1,$3}’ passwd 模式+动作 ##打印含root行的以:分割的第一第三列
4. command | awk 'pattern {action}' filename 如 df -P |grep '/' |awk '$4>250{print $4}' 管道 ##第四列大于250 打印第四列
(四) awk 工作原理解析:
输出变量的逗号都会映射成OFS的值,就算自己指定了OFS,也用逗号分割你的多个变量输出格式。
(五) AWK 内置变量 man awk
NF 是这一行字段数,$NF是字段第NF个字段:
(六) AWK的格式化输出
[hujianmei@localhost days_10]$ date | awk '{print "Month:" $2 "\nYear:" $NF}'
Month:02月
Year:CST
[hujianmei@localhost days_10]$ awk -F: '{print "username is:" $1 "\t uid is: " $3}' passwd
username is:##root uid is: 0
username is:#bin uid is: 1
username is:##daemon uid is: 2
username is:adm uid is: 3
username is:lp uid is: 4
username is:sync uid is: 5
username is:shutdown uid is: 6
username is:halt uid is: 7
username is:mail uid is: 8
username is:operator uid is: 11
[hujianmei@localhost days_10]$ awk -F: '{printf "%-15s %-10s %-15s\n",$1,$2,$3}' passwd
##root x 0
#bin x 1
##daemon x 2
adm x 3
lp x 4
sync x 5
shutdown x 6
halt x 7
mail x 8
operator x 11
[hujianmei@localhost days_10]$ awk -F: '{printf "|%-15s |%-10s |%-15s\n",$1,$2,$3}' passwd
|##root |x |0
|#bin |x |1
|##daemon |x |2
|adm |x |3
|lp |x |4
|sync |x |5
|shutdown |x |6
|halt |x |7
|mail |x |8
|operator |x |11
[hujianmei@localhost days_10]$
20200221