awk是一种优良的文本处理器,它可以扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。它也是一种用于处理文本的编程语言工具.也正是因为它的强大功能,所以它也是处理文本所用的三个工具中最复杂的一个.
awk [选项] ‘命令’ 文件
awk脚本是由模式和操作组成的
模式
正则表达式:正则表达式用/ /加在中间
关系表达式:大于,小于,大于等于,小于等于,等于,不等于
模式匹配表达式:用 ~ 表示匹配, !~ 表示不匹配
BEGIN语句块,pattern语句块,END语句块
操作
操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是 :
基本结构
awk ‘BEGIN{ print “头部分”} pattern{ 命令} END{ print “尾部分”}’
这三部分都是可选的,也就是说可以不出现在脚本语句中
awk的内置变量非常的多,我们直接使用习题来进行测试
awk 'BEGIN{ print "hello awk"}'
awk 'BEGIN { print "这是一个符号 ('"'"')" }'
那么我们可以在对这段简化
awk 'BEGIN { print "这是一个符号 ('\'')" }'
还可以再使用变量,即-v参数例如
awk -v sq="'" 'BEGIN{print "这是一个符号("sq")"}'
我们在这里一开始使用-v参数定义了一个名为sq的变量,内容为‘ 在后面的awk语句中就可以直接使用
需要注意的是,每定义一个变量,就需要一个-v参数
扩展 \47
表示单引号’
\42
表示双引号"
在进行测试之前,先准备一个名为mail-list的文件,内容是
Amelia 555-5553 [email protected] F
Anthony 555-3412 [email protected] A
Becky 555-7685 [email protected] A
Bill 555-1675 [email protected] A
Broderick 555-0542 [email protected] R
Camilla 555-2912 [email protected] R
Fabius 555-1234 [email protected] F
Julie 555-6699 [email protected] F
Martin 555-6480 [email protected] A
Samuel 555-3430 [email protected] A
Jean-Paul 555-2127 [email protected] R
一个名为data的文件,内容为
Jan 13 25 15 115
Feb 15 32 24 226
Mar 15 24 34 228
Apr 31 52 63 420
May 16 34 29 208
Jun 31 42 75 492
Jul 24 34 67 436
Aug 15 34 47 316
Sep 13 55 37 277
Oct 29 54 68 525
Nov 20 87 82 577
Dec 17 35 61 401
Jan 21 36 64 620
Feb 26 58 80 652
Mar 24 75 70 495
Apr 21 70 74 514
awk '/li/ { print $0 }' mail-list
对字符串进行匹配需要用/ /包起来;
$0 这个变量包含执行过程中当前行的文本内容,简单来说,就是输出li所在行的所有内容
awk 'length($0) > 80' data
匹配字段使用length()函数
发现没有输出结果,说明没有匹配到长度大于80的字段
awk '{ if (length($0) > max) max = length($0) }END { print max }' data
expand data | awk '{ if (x < length($0)) x = length($0) }END { print "maximum line length is " x }'
这里使用了expand命令,它也是一种查看文件的命令,在这里不多细讲
awk 'NF > 0' data
awk 'BEGIN { for (i = 1; i <= 7; i++)print int(101 * rand()) }'
rand()也是一个函数,它用来生成随机数,此处用法为: n*rand()生成一个0-n的随机数,多次调用会产生相同的随机数,所以产生的并不是随机数,而是伪随机数
awk '/12/ { print $0 }/21/ { print $0 }' mail-list data
那么,如果有一个文件不存在呢 ,分别写错第二个和第一个文件,得出结果如下:
通过这个结果可以看出,写错第二个文件时,不影响第一个文件的处理,但是写错第一个文件,那么第二个文件也不会进行处理。
所以我们可以得出结果当前面的文件出错,后面的不会进行,但是后面文件的正确与否不影响前面文件的处理
ls -l | awk '$6 == "Nov" { sum += $5 }END { print sum }'
我们在这里先查看了文件的特点,发现第六列是月份,第五列是大小,那么我们就可以使用上面的命令,指定第六列,然后对第五列的值进行累加,最后输出
这里面有一个$5,$6的参数,这是指定列, $n意思是指定第n列(字段)
有时候我们的命令会输的太长了,那么我们可以使用\来换行
print \
"hello,world"\
}'
注意,在输入\进行换行时,不要写后半个’ 不然会出错
总结:
awk是个非常复杂的工具,要想学好学精还有很长的路要走,需要不懈的努力,上面的用法只是最最基础的一部分,如果有机会,我会在后面继续补充awk的用法。