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     amelia.zodiacusque@gmail.com    F
Anthony      555-3412     anthony.asserturo@hotmail.com   A
Becky        555-7685     becky.algebrarum@gmail.com      A
Bill         555-1675     bill.drowning@hotmail.com       A
Broderick    555-0542     broderick.aliquotiens@yahoo.com R
Camilla      555-2912     camilla.infusarum@skynet.be     R
Fabius       555-1234     fabius.undevicesimus@ucb.edu    F
Julie        555-6699     julie.perscrutabor@skeeve.com   F
Martin       555-6480     martin.codicibus@hotmail.com    A
Samuel       555-3430     samuel.lanceolis@shu.edu        A
Jean-Paul    555-2127     jeanpaul.campanorum@nyu.edu     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

在这里插入图片描述NF表示总字段数 NF > 0 表示字段数大于零的行

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

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

在这里插入图片描述
rand()也是一个函数,它用来生成随机数,此处用法为: n*rand()生成一个0-n的随机数,多次调用会产生相同的随机数,所以产生的并不是随机数,而是伪随机数

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

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

在这里插入图片描述直接在awk后面写上两个文件,即可对两个文件进行匹配

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

在这里插入图片描述通过这个结果可以看出,写错第二个文件时,不影响第一个文件的处理,但是写错第一个文件,那么第二个文件也不会进行处理。
所以我们可以得出结果当前面的文件出错,后面的不会进行,但是后面文件的正确与否不影响前面文件的处理

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

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

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

9. 命令换行

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

print \ 
"hello,world"\
}'

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


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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值