系列目录与参考文献传送门: shell入门学习笔记-序章
ls -l /bin/awk
$
后跟数字,引用对应的字段,以逗号分隔,0表示整个行。如:$1
表示第一个字段,$0
表示整行。awk [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]
awk 选项 '匹配模式 {命令}' file
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个字段。
命令参数包括以下几种:
关于命令参数不在这里细说,穿插到后续的学习笔记中。
选项 | 描述 |
---|---|
-f program-file | 从文件中读取awk程序源文件 |
-F fs | 指定fs为输入字段分隔符 |
-v var=value | 变量赋值 |
–posix | 兼容POSIX正则表达式 |
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
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-10
和12:30:59
。:
为字段分隔符时,12:30:59
划分为三个字段:12
、30
和59
。admindeMacBook-Pro:myshell admin$ echo "2018-13-10 12:30:59" |awk -F '[- :]' '{print $4}'
12
awk -F '[- :]'
其中[]
可以参考正则表达式,即:中括号中的任意一个字符都可以作为字段分隔符。# 引用内部变量
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'"
。匹配模式 | 描述 |
---|---|
BEGIN{ } | 给程序赋予初始状态,先执行的工作 |
END{ } | 程序结束之后执行的一些扫尾工作 |
/regular expression/ | 为每个输入记录匹配正则表达式 |
pattern && pattern | 逻辑and,满足两个模式 |
pattern || pattern | 逻辑or,满足其中一个模式 |
! pattern | 逻辑not,不满足模式 |
pattern1, pattern2 | 范围模式,匹配所有模式1的记录,直到匹配到模式2 |
首先看一下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.
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