shell入门学习笔记-15-命令详解: 三剑客之一awk-语法、选项参数、匹配模式参数

系列目录与参考文献传送门: shell入门学习笔记-序章

shell-命令详解-awk

  • AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。
  • 其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。
  • 这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。
  • AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。
  • 在Linux系统下默认awk是gawk,它是awk的GNU版本。可以通过命令查看应用的版本:ls -l /bin/awk
  • awk处理的工作方式与数据库类似,支持对记录和字段处理,这也是grep和sed不能实现的。
    • 缺省的情况下将文本文件中的一行视为一个记录,逐行放到内存中处理;
    • 将一行中的某一部分作为记录中的一个字段。用1,2,3…数字的方式顺序的表示行(记录)中的不同字段;
    • $后跟数字,引用对应的字段,以逗号分隔,0表示整个行。如:$1表示第一个字段,$0表示整行。

awk语法

awk [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]
awk 选项 '匹配模式 {命令}' file

helloworld

admindeMacBook-Pro:myshell echo "1. Hello 111 world 222 AWK \!" |awk '{print $2,$6,$4}'
Hello AWK world

awk '{print $2$6$4}'1. Hello 111 world 222 AWK !当做条记录,每个空格间隔一个字段,打印其中的第2、6、4个字段。

命令参数

命令参数包括以下几种:

  • print
  • 流程控制
  • I/O操作

关于命令参数不在这里细说,穿插到后续的学习笔记中。

awk选项参数

选项描述
-f program-file从文件中读取awk程序源文件
-F fs指定fs为输入字段分隔符
-v var=value变量赋值
–posix兼容POSIX正则表达式

从文件读取awk程序awk -f program-file

admindeMacBook-Pro:myshell admin$ cat hello.awk
{print $2$6$4}
admindeMacBook-Pro:myshell admin$ echo "1. Hello 111 world 222 AWK \!" |awk -f hello.awk
HelloAWKworld

指定字段分隔符awk -F fs

admindeMacBook-Pro:myshell admin$ echo "2018-12-10 12:30:59" |awk '{print $2}'
12:30:59
admindeMacBook-Pro:myshell admin$ echo "2018-12-10    12:30:59" |awk '{print $2}'
12:30:59
admindeMacBook-Pro:myshell admin$ echo "2018-12-10 12:30:59" |awk '{print $2}' |awk -F ':' '{print $1}'
12
  • 默认情况下,以空格为字段直接的分隔符。如2018-12-10 12:30:59可以划分为两个字段:2018-12-1012:30:59
  • 当以:为字段分隔符时,12:30:59划分为三个字段:123059
admindeMacBook-Pro:myshell admin$ echo "2018-13-10 12:30:59" |awk -F '[- :]' '{print $4}'
12
  • awk -F '[- :]'其中[]可以参考正则表达式,即:中括号中的任意一个字符都可以作为字段分隔符。

变量赋值awk -v var=value

# 引用内部变量
admindeMacBook-Pro:myshell admin$ echo "AWK" |awk '{print $1}'
AWK
admindeMacBook-Pro:myshell admin$ echo "AWK" |awk -v a=hello -v b=world '{print $1,a,b}'
AWK hello world

admindeMacBook-Pro:myshell admin$ echo "AWK" |awk '{print a,$1,b}' a=hello b=world
hello AWK world
admindeMacBook-Pro:myshell admin$ echo "AWK" |awk a=hello b=world '{print a,$1,b}'
awk: can't open file {print a,$1,b}
 source line number 1

# 引用外部变量
admindeMacBook-Pro:myshell admin$ echo $aa
hello
admindeMacBook-Pro:myshell admin$ echo $bb
world
admindeMacBook-Pro:myshell admin$ echo "AWK" |awk '{print "'$aa'",$1,"'$bb'"}'
hello AWK world
  • 内部变量赋值的标准格式是:awk -v a=hello -v b=world,每个变量一个-v.
  • awk引用外部变量时,对外部变量的书写方式形如:"'$var'"

awk匹配模式参数

匹配模式描述
BEGIN{ }给程序赋予初始状态,先执行的工作
END{ }程序结束之后执行的一些扫尾工作
/regular expression/为每个输入记录匹配正则表达式
pattern && pattern逻辑and,满足两个模式
pattern || pattern逻辑or,满足其中一个模式
! pattern逻辑not,不满足模式
pattern1, pattern2范围模式,匹配所有模式1的记录,直到匹配到模式2

BEGIN{}和END{}

首先看一下awk的执行流程图:

在这里插入图片描述

说明:

  • BEGIN命令快是处理每行数据之前执行的操作,常用于修改内置变量、变量赋值和打印输出的页眉或标题。
  • END命令是处理完每行数据之后执行的操作,常用于打印输出总结、页脚。
admindeMacBook-Pro:myshell admin$ cat a.txt
1 hanchao 22 male
2 zhangsan 13 female
3 lisi 23 male
4 wangwu 33 male
admindeMacBook-Pro:myshell admin$ cat a.txt |awk 'BEGIN{print "ID\tName\tAge\tGender\n-----------------------------"}
> {print $0}
> END{print "-----------------------------\nTotal 4 student."}'
ID	Name	Age	Gender
-----------------------------
1 hanchao 22 male
2 zhangsan 13 female
3 lisi 23 male
4 wangwu 33 male
-----------------------------
Total 4 student.

正则匹配/regular expression/

admindeMacBook-Pro:myshell admin$ cat a.txt
1 hanchao 22 male
2 zhangsan 13 female
3 lisi 23 male
4 wangwu 33 male
# 查找所有女性
admindeMacBook-Pro:myshell admin$ cat a.txt |awk '/female/{print $0}'
2 zhangsan 13 female

逻辑与&&、或||、非!

# 查找33岁的男性
admindeMacBook-Pro:myshell admin$ cat a.txt
1 hanchao 22 male
2 zhangsan 13 female
3 lisi 22 male
4 wangwu 33 male
admindeMacBook-Pro:myshell admin$ cat a.txt |awk '/ male/{print $0}'
1 hanchao 22 male
3 lisi 22 male
4 wangwu 33 male
admindeMacBook-Pro:myshell admin$ cat a.txt |awk '/ male/&&/33/{print $0}'
4 wangwu 33 male

# 查找女性或者33的人员
admindeMacBook-Pro:myshell admin$ cat a.txt |awk '/female/||/33/{print $0}'
2 zhangsan 13 female
4 wangwu 33 male

# 查找除hanchao之外的任意
admindeMacBook-Pro:myshell admin$ cat a.txt |awk '!/hanchao/{print $0}'
2 zhangsan 13 female
3 lisi 22 male
4 wangwu 33 male

范围匹配//,//

# 查找ID从2到3的所有人员
admindeMacBook-Pro:myshell admin$ cat a.txt |awk '/^2/,/^3/{print $0}'
2 zhangsan 13 female
3 lisi 22 male
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值