awk的常用语法及示例

awk的使用方法

简介

awk是一种优良的文本处理器,它可以扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。它也是一种用于处理文本的编程语言工具.也正是因为它的强大功能,所以它也是处理文本所用的三个工具中最复杂的一个.


格式

awk [选项] ‘命令’ 文件


awk脚本的组成

awk脚本是由模式操作组成的

模式

  • 正则表达式:正则表达式用/ /加在中间

  • 关系表达式:大于,小于,大于等于,小于等于,等于,不等于

  • 模式匹配表达式:用 ~ 表示匹配, !~ 表示不匹配

  • BEGIN语句块,pattern语句块,END语句块

操作
操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是 :

  • 变量或数组赋值
  • 输出命令
  • 内置函数
  • 控制流语句

基本结构
awk ‘BEGIN{ print “头部分”} pattern{ 命令} END{ print “尾部分”}’
这三部分都是可选的,也就是说可以不出现在脚本语句中


awk测试

awk的内置变量非常的多,我们直接使用习题来进行测试

1. 如何使用awk输出 hello awk

awk 'BEGIN{ print "hello awk"}'

在这里插入图片描述
使用这种方法awk就相当于我们用的echo

2. 那么我们在输出一个符号 ‘ 呢

awk 'BEGIN { print "这是一个符号 ('"'"')" }'

在这里插入图片描述是不是看起来非常复杂,其实拆开看:第一组引号"’'这是引用,然后" "是用来转义 ’ 的

那么我们可以在对这段简化
awk 'BEGIN { print "这是一个符号 ('\'')" }'

在这里插入图片描述
在这里使用转义符 \ 对上一段的“”进行了替换,很明显的简化了代码

还可以再使用变量,即-v参数例如
awk -v sq="'" 'BEGIN{print "这是一个符号("sq")"}'

在这里插入图片描述我们在这里一开始使用-v参数定义了一个名为sq的变量,内容为‘ 在后面的awk语句中就可以直接使用
需要注意的是,每定义一个变量,就需要一个-v参数

扩展 \47表示单引号’
\42表示双引号"

在这里插入图片描述

3. 使用awk对文本进行处理

在进行测试之前,先准备一个名为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

1. 在mail-list中对li进行匹配

awk '/li/ { print $0 }' mail-list

在这里插入图片描述

对字符串进行匹配需要用/ /包起来;
$0 这个变量包含执行过程中当前行的文本内容,简单来说,就是输出li所在行的所有内容

2. 匹配data中长度大于80的所有字段

awk 'length($0) > 80' data

在这里插入图片描述

匹配字段使用length()函数
发现没有输出结果,说明没有匹配到长度大于80的字段

3. 输出data中长度最长的行长度

awk '{ if (length($0) > max) max = length($0) }END { print max }' data

在这里插入图片描述
在这里,我们在awk中添加了if语句,去寻找data中最长的字段长度,最后对其进行输出

4. 输出data中长度最短的行的长度

expand data | awk '{ if (x < length($0)) x = length($0) }END { print "maximum line length is " x }'

在这里插入图片描述
这里使用了expand命令,它也是一种查看文件的命令,在这里不多细讲

5.打印至少有一个字段的每一行

awk 'NF > 0' data

awk的常用语法及示例_第1张图片NF表示总字段数 NF > 0 表示字段数大于零的行

6.打印从0到100的七个随机数

awk 'BEGIN { for (i = 1; i <= 7; i++)print int(101 * rand()) }'

awk的常用语法及示例_第2张图片
rand()也是一个函数,它用来生成随机数,此处用法为: n*rand()生成一个0-n的随机数,多次调用会产生相同的随机数,所以产生的并不是随机数,而是伪随机数

7.在mail-list中匹配12 在data中匹配21

awk '/12/ { print $0 }/21/ { print $0 }' mail-list data

awk的常用语法及示例_第3张图片直接在awk后面写上两个文件,即可对两个文件进行匹配

那么,如果有一个文件不存在呢 ,分别写错第二个和第一个文件,得出结果如下:

awk的常用语法及示例_第4张图片通过这个结果可以看出,写错第二个文件时,不影响第一个文件的处理,但是写错第一个文件,那么第二个文件也不会进行处理。
所以我们可以得出结果当前面的文件出错,后面的不会进行,但是后面文件的正确与否不影响前面文件的处理

8. 匹配当前目录下十一月所修改的文件大小总和

ls -l | awk '$6 == "Nov" { sum += $5 }END { print sum }'

awk的常用语法及示例_第5张图片我们在这里先查看了文件的特点,发现第六列是月份,第五列是大小,那么我们就可以使用上面的命令,指定第六列,然后对第五列的值进行累加,最后输出
这里面有一个$5,$6的参数,这是指定列, $n意思是指定第n列(字段)

9. 命令换行

有时候我们的命令会输的太长了,那么我们可以使用\来换行

print \ 
"hello,world"\
}'

注意,在输入\进行换行时,不要写后半个’ 不然会出错


总结:
awk是个非常复杂的工具,要想学好学精还有很长的路要走,需要不懈的努力,上面的用法只是最最基础的一部分,如果有机会,我会在后面继续补充awk的用法。

你可能感兴趣的:(awk的常用语法及示例)