AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。
awk '{pattern + action}' {filenames}
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。{}不需要在程序中始终出现,但它们用于根据特定的模式对一系列
指令进行分组。
练习内容如下,AWK会将所有字段按$1,$2,$3……进行划分,理论上不限字段大小,全部字段被定义为$0
ID |
COUNTRY |
FIRST_NAME |
LAST_NAME |
JOB_ID |
SALARY |
43091 |
USA |
Donald |
OConnell |
SH_CLERK |
2600 |
43092 |
China |
Douglas |
Grant |
SH_CLERK |
2600 |
43093 |
Japan |
Jennifer |
Whalen |
AD_ASST |
4400 |
43094 |
Germany |
Michael |
Hartstein |
MK_MAN |
13000 |
43095 |
France |
Pat |
Fay |
MK_REP |
6000 |
43096 |
UK |
Susan |
Mavris |
HR_REP |
6500 |
43097 |
Italy |
Hermann |
Baer |
PR_REP |
10000 |
43098 |
Brazil |
SHELL |
Higgins |
AC_MGR |
12000 |
43099 |
Canada |
William |
Gietz |
AC_ACCOUNT |
8300 |
43100 |
Russia |
Steven |
King |
AD_PRES |
24000 |
43101 |
India |
Neena |
Kochhar |
AD_VP |
17000 |
43102 |
Spain |
Lex |
De Haan |
AD_VP |
17000 |
1、 简单查询
[root@linux ~]# cat list.txt | awk '{ print $0}'
# 或者awk '{ print $0}' list.txt
43091 USA Donald OConnell SH_CLERK 2600
43092 China Douglas Grant SH_CLERK 2600
43093 Japan Jennifer Whalen AD_ASST 4400
43094 Germany Michael Hartstein MK_MAN 13000
43095 France Pat Fay MK_REP 6000
43096 UK Susan Mavris HR_REP 6500
43097 Italy Hermann Baer PR_REP 10000
43098 Brazil SHELL Higgins AC_MGR 12000
43099 Canada William Gietz AC_ACCOUNT 8300
43100 Russia Steven King AD_PRES 24000
43101 India Neena Kochhar AD_VP 17000
43102 Spain Lex De Haan AD_VP 17000
[root@linux ~]# cat list.txt | awk '{ print $1,$2,$3}'
# 或者awk '{ print $1,$2,$3}' list.txt
43091 USA
43092 China Douglas
43093 Japan Jennifer
43094 Germany Michael
43095 France Pat
43096 UK Susan
43097 Italy Hermann
43098 Brazil SHELL
43099 Canada William
43100 Russia Steven
43101 India Neena
43102 Spain Lex
2、 简单过滤
[root@linux ~]# awk '/REP/' list.txt
# 单条件过滤,过滤含REP的内容。
43095 France Pat Fay MK_REP 6000
43096 UK Susan Mavris HR_REP 6500
43097 Italy Hermann Baer PR_REP 10000
[root@linux ~]# awk '/REP|VP/' list.txt
# 过滤含REP或VP的内容
43095 France Pat Fay MK_REP 6000
43096 UK Susan Mavris HR_REP 6500
43097 Italy Hermann Baer PR_REP 10000
43101 India Neena Kochhar AD_VP 17000
43102 Spain Lex De Haan AD_VP 17000
[root@linux ~]# awk '/REP|VP/ { print $2,$3,$4; print $5,$1}' list.txt
# ;号换行输出
France Pat Fay
MK_REP 43095
UK Susan Mavris
HR_REP 43096
Italy Hermann Baer
PR_REP 43097
India Neena Kochhar
AD_VP 43101
Spain Lex De
Haan 43102
[root@linux ~]# awk '/REP|VP/ { print $2,$3,$4; print $5":"$1"\n"}' list.txt
# ;号换行输出,增加换行。Shell下的\t(制表)、\r(回车)、\n(换行)等都可以awk中使用。
France Pat Fay
MK_REP:43095
UK Susan Mavris
HR_REP:43096
Italy Hermann Baer
PR_REP:43097
India Neena Kochhar
AD_VP:43101
Spain Lex De
Haan:43102
3、 复杂查询
[root@linux ~]# awk '/SH/' list.txt
#此处预查询JOB_ID,43098记录非查询结果。此处可以使用~进行精确过滤。
43091 USA Donald OConnell SH_CLERK 2600
43092 China Douglas Grant SH_CLERK 2600
43098 Brazil SHELL Higgins AC_MGR 12000
[root@linux ~]# awk '$5 ~ /SH/' list.txt
# 用 ~ 对第5列进行匹配
43091 USA Donald OConnell SH_CLERK 2600
43092 China Douglas Grant SH_CLERK 2600
4、 OFS变量
[root@linux ~]# awk -F: '{ print $1}' /etc/passwd
# -F指定字段间分隔符
root
bin
daemon
adm
lp
sync
shutdown
halt
news
uucp
operator
games
gopher
ftp