概念
awk是一种优良的文本处理工具,linux及unix环境中现有的功能最强大的数据处理引擎之一,这种编程及数据操作语言的最大功能取决于一个人所拥有的知识
awk是三个人名的缩写
awk语言是由模式和动作组成
模式
正则表达式
关系表达式
匹配表达式
动作
变量
命令
内置函数
流控制语句
BEGIN语句 : 设置计数和打印头部信息,在任何动作之前执行
END语句 : 输出统计结果,在完成动作之后执行
awk工作通过3个步骤
- 读:从文件,管道,或者标准输入中读入一行然后把它放入内存中
- 执行:对每一行数据,根据AWK命令按照顺序执行,默认情况是处理每一行数据,也可以指定模式
- 重复,:一直重复上述两个过程直到文件结束
AWK支持两种不同类型的变量:内置变量,自定义变量
$n : 当前记录的第n个字段,
$0 : 执行过程中当前行的文本内容
FILENAME : 当前输入文件的名
FS : 字段分割符(默认是空格)
$NF : 最后一列
NF : 每一行的字段数量
FNR : 各文件分别计数的行号
NR : 表示记录数,在执行过程中对应于当前的行号,
NR和FNR的区别,
NR在读取不同文件时,是一直增加的
FNR在读取下一个文件时,从1开始计算
OFS : 输出字段分隔符(默认值是一个空格)
ORS : 输出记录分隔符(默认值是一个换行符)
RS : 记录分隔符(默认是一个换行符)
\t : 制表符
\n : 换行符
~ : 匹配
!~ : 不匹配
-F指定输入分隔符,fs可以是字符串或者正则,分隔符默认是空格
[root@localhost ~]# echo aa/bb/cc/dd | awk -F "/" '{print $2}'
bb
将passwd中的用户名打印出来
[root@localhost ~]# awk -F ":" '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
或者
[root@localhost ~]# awk 'BEGIN{FS=":"}{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
过滤出系统的ip地址
[root@localhost ~]# ifconfig ens33 | grep netmask | awk '{print $2}'
192.168.43.162
参与运算
[root@localhost ~]# echo "12 12 14 1" > a.txt
[root@localhost ~]# awk '{print $1+10}' a.txt
22
[root@localhost ~]# echo "one two three four" | awk '{print $NF}'
four
[root@localhost ~]# echo "one two three four" | awk '{print $(NF-1)}'
three
[root@localhost ~]# echo "one two three four" | awk '{print $(NF/2)}'
two
打印出passwd文件中用户uid小于10的用户名和他登录使用的shell
格式化输出 \t:tab键制表符
[root@localhost ~]# awk -F ":" '$3<10{print $1,"\t<===>\t",$NF}' /etc/passwd
root <===> /sbin/nologin
bin <===> /sbin/nologin
daemon <===> /sbin/nologin
adm <===> /sbin/nologin
打印出passwd中uid小于10且shell是bin/bash的用户
[root@localhost ~]# awk -F ":" '$3<10&&$NF="bin/bash"{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
开始和结束模块
可以将上面的内容写入到脚本文件
[root@localhost ~]# cat test1.awk
BEGIN{
print "UserId\t\t\tShell"
print "=================="
FS=":"
}
$3<10 && $ NF="/sbin/nologin"{
printf "%-20s %-20s\n",$1,$NF
}
执行
[root@localhost ~]# awk -f test1.awk /etc/passwd
UserId Shell
==================
root /sbin/nologin
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /sbin/nologin
shutdown /sbin/nologin
halt /sbin/nologin
mail /sbin/nologin
sss /sbin/nologin
打印以root开头的行
[root@localhost ~]# awk -F: '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
以bash结尾的行
[root@localhost ~]# awk '/bash$/' /etc/passwd
sss:x:0:0::/home/sss:/bin/bash
输出行号大于等于3且小于等于6的行
[root@localhost ~]# awk -F: '(NR>=3&&NR<=6){print $0}' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
取出ip地址,(使用NR行号来定位)
[root@localhost ~]# ifconfig ens33 | awk 'NR==2{print $2}'
192.168.43.162
去除首行内容
[root@localhost ~]# ll
总用量 1716
-rw-r--r-- 1 root root 11 10月 8 20:56 a.txt
-rw-r--r-- 1 root root 95 10月 9 08:37 free.sh
drwxrwxr-x 6 root root 325 9月 26 18:14 redis-4.0.11
[root@localhost ~]# ll | grep -v ^总
-rw-r--r-- 1 root root 11 10月 8 20:56 a.txt
-rw-r--r-- 1 root root 95 10月 9 08:37 free.sh
drwxrwxr-x 6 root root 325 9月 26 18:14 redis-4.0.11
[root@localhost ~]# ll | sed 1d
-rw-r--r-- 1 root root 11 10月 8 20:56 a.txt
-rw-r--r-- 1 root root 95 10月 9 08:37 free.sh
drwxrwxr-x 6 root root 325 9月 26 18:14 redis-4.0.11
[root@localhost ~]# ll | awk 'NR!=1{print $0}'
-rw-r--r-- 1 root root 11 10月 8 20:56 a.txt
-rw-r--r-- 1 root root 95 10月 9 08:37 free.sh
drwxrwxr-x 6 root root 325 9月 26 18:14 redis-4.0.11
使用awk找到包含root字符的行
[root@localhost ~]# awk '/root/{print}' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost ~]# awk '/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
[root@localhost ~]# awk '/root/' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
不匹配root行
[root@localhost ~]# awk '!/root/' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
....
如果UID大于10,则输出user=>用户名, 否则输出pass=>用户名
[root@localhost ~]# awk -F: '{if($3>10){print "user=>"$1}else{print "pass=>"$1}}' /etc/passwd
pass=>root
pass=>bin
pass=>daemon
pass=>adm
pass=>lp
pass=>sync
pass=>shutdown
pass=>halt
pass=>mail
user=>operator
user=>games
user=>ftp
user=>nobody
user=>systemd-network
查出行号大于10,并且包含bin/bash的行
[root@localhost ~]# awk 'NR>10 && $NF ~ "bin/bash"{print $0}' /etc/passwd
sss:x:0:0::/home/sss:/bin/bash
引用变量时,使用单引号+双引号括起来的方式
[root@localhost ~]# awk 'BEGIN{print "'$USER'"}'
root
格式化输出内容
printf
不会自动打印换行符\n
%c显示字符的AscII码
%d十进制整数
%f显示浮点数
%s显示字符串
%% % 本身
%u 无符号整数
输出passwd文件的用户名列内容
[root@localhost ~]# awk -F":" '{printf "%s\n",$1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt