前言
AWK 变成语言
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk ) -----摘自百度百科。
gawk免费 所以linux默认使用 GNU AWK 用户手册文档 https://www.gnu.org/software/gawk/manual/gawk.html
在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。而awk比较倾向于将一行分成多个字段然后进行处理。AWK信息的读入也是逐行 指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互 的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。
工作原理
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理,执行结果可以通过 print 的功能将字段数据打印显示。
语法及基本使用
语法
awk [options] 'script' file1 file2, ...
awk [options] 'PATTERN {acticon}' file1 file2, ...
1.pattern
决定动作语句何时触发及触发事件:BEGIN、END
[root@sv1 ~]# awk -F: 'BEGIN {print "hello"} {print $1}' /etc/passwd |head -n3
hello #优先处理BEGIN指定动作 先处理hello。
root
bin
2. action
对数据进行处理,放在{}内指明:print、printf 最常用的是 print,默认以空白字符分隔
$0 代表整行,$1 代表第 1 段,$2 代表第 2 段,以此类推, $NF代表最后一个字段,多个字段直接用逗号隔开
awk '{print $1, $2}' file
3.. options
参数:输入分隔符,默认以空白字符分隔 -F 选项来执行分隔符 可自定义分隔符 -v var=value 变量赋值
[root@sv1 ~]# awk -F: '{print $3,$1}' /etc/passwd
4.内置变量
FS:输入字段分隔符,默认空白字符,一般需要加 -F OFS:输出字段分隔符,默认是空格,一般需要加 -v NF:当前处理的行的字段个数(常用) NR:当前处理的行的行号 (常用) RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
FS
[root@sv1 ~]# awk -v FS=':' '{print $1FS$3}' /etc/passwd
# FS相当于赋值分隔符 : 进出处理数据。
NF
[root@sv1 ~]# awk -F: '{print NF}' /etc/passwd
7
7
7
7
#直接使用NF 表示当前处理行的字段个数是7
[root@sv1 ~]# awk -F: '{print $NF}' /etc/passwd
/bin/bash
/sbin/nologin
# $NF 表示最后一个字段
root@sv1 ~]# awk -F: '{print $(NF-1)}' /etc/passwd
/root
/bin
/sbin
# $NF-1 表示倒数第二个字段
NR
root@sv1 ~]# awk -F: '{print $1,NR}' /etc/passwd
root 1
bin 2
daemon 3
adm 4
lp 5
sync 6
NR==n,NR==m 打印n行到m行
[root@sv1 ~]# awk 'NR==1,NR==3{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
NR==n||NR==m 打印第n行 和第m行。
[root@sv1 ~]# awk 'NR==3||NR==7{print }' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
(NR%2)==0或者1 打印偶数行和奇数行
[root@sv1 ~]# awk '(NR%2)==1{print NR}' /etc/passwd
打印出普通用户
[root@sv1 ~]# awk -F: '$3>1000{print}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
5.自定义变量
-v 变量赋值 自定义变量
[root@sv1 ~]# awk -v abc='vvv' 'BEGIN{print abc}'
vvv
# -v 后 abc变量赋值vvv 打印变量名abc
[root@sv1 ~]# awk -v a=b="666" 'BEGIN{a=b="666";print a,b}'
666 666 # 如果不在{}内部定义a=b=“666” 会默认变量a=(b=666)
[root@sv1 ~]# awk -v a=b="666" 'BEGIN{print a,b}'
b=666
!!#ffff00 printf !!
%s:显示字符串
%d, %i:显示十进制整数
%f:显示为浮点数
%e, %E:显示科学计数法数值
%c:显示字符的ASCII码
%g, %G:以科学计数法或浮点形式显示数值
%u:无符号整数
%%:显示%自身
awk -F: '{printf "%s",$1}' /etc/passwd
awk -F: '{printf "%s\n",$1}' /etc/passwd
awk -F: '{printf "%20s\n",$1}' /etc/passwd
awk -F: '{printf "%-20s\n",$1}' /etc/passwd
awk -F: '{printf "%-20s %10d\n",$1,$3}' /etc/passwd
awk -F: '{printf "Username: %s\n",$1}' /etc/passwd
awk -F: '{printf “Username: %sUID:%d\n",$1,$3}' /etc/passwd
awk -F: '{printf "Username: %25sUID:%d\n",$1,$3}' /etc/passwd
awk -F: '{printf "Username: %-25sUID:%d\n",$1,$3}' /etc/passwd
6.关系表达式
关系表达式结果为“真”才会被处理 真:结果为非0值,非空字符串 会进行打印 假:结果为空字符串或0值 不处理。
[root@sv1 ~]# seq 4 |awk 1
1
2
3
4
[root@sv1 ~]# seq 4 |awk 0
打印非第一行
[root@sv1 ~]# seq 10 |awk 'n++' # n未赋值 首先n=0 输出之后为0 假 不打印 n++ 是先处理 再+1 第二次n=1 为非0值 可以打印 以此类推 除了第一行 都显示
2
3
4
5
6
7
8
9
10
#'!n++' 只打印第一行
打印奇数偶数
[root@sv1 ~]# seq 10 | awk -v i="1" 'i=!i'
2
4
6
8
10
[root@sv1 ~]# seq 10 | awk -v i="0" 'i=!i'
1
3
5
7
结合正则匹配使用
匹配UID打印。
[root@sv1 ~]# awk ' /^UUID/{print $1}' /etc/fstab
UUID=b01d4041-8810-4654-9d25-802b3f402bd0
打印第几行 第几列
[root@sv1 ~]# awk -F: 'NR==3{print $1}' /etc/passwd
daemon
[root@sv1 ~]# awk -F: 'NR==3{print $3}' /etc/passwd
2
打印多少行之间 并且显示行号
[root@sv1 ~]# awk 'NR>=3 && NR<=5{print NR,$0}' /etc/passwd
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin