awk是一种专门处理类似“二维表”结构数据的命令
awk按行进行读取,并对每行进行切片(默认以空格或Tab为分隔符)
awk有5种实现方式,下文有列出,初学会觉得像茴香豆的茴有几种写法,个人觉得不在于记忆,而在于对实现方式的理解,理解这几种实现方式也是在理解linux命令的组织形式。
设有一文件名为data.txt
data.txt
a 1 2
b 3 5
c 3 0
awk命令单引号(注意:只能是单引号)中填写过滤条件与执行命令(执行命令写在花括号内)
#----------方式一 基础版------------
awk '$3>1 {print $1,$2*$3}' data.txt
#----------方式二 管道--------------
cat data.txt | awk '$3>1 {print $1,$2*$3}'
方式三四五都用到了可执行文件
首先写好可执行文件prog
#!/usr/bin/awk -f
$3 > 0 {print $1,$2*$3}
#--------方式三 读取文件内容--------
awk -f prog data.txt
#---------方式四 读取文件结合管道---------
cat data.txt | awk -f prog
#---------方式五 给文件加执行权限后运行---------
chmod +x prog
cat data.txt | ./prog
# chomod +x 可以给一个文件执行权限即x
# chomod -x 就可以去掉执行权限
注意点
awk -F [分隔符] 可以将分割符改成任意值(默认为空格和Tab)
awk -v [var=val] 可以设置一初始变量var,令其值为val
NR 记录行号
NF 记录当前行内字段数
$0 记录当前整行内容
花括号内支持使用C语言
BEGIN{} 关键字使花括号内内容在执行前就先执行
END{}关键字使花括号内内容在执行最后执行
实践
1.针对以下文本内容的操作,请写出相关的 awk 命令
Beth 4.00 0
Dan 3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
- 当第 3 列大于 0 时,输出文本中对应行的第 1 列和第 2 列与第 3 列之积
- 统计第 3 列大于 15 的行数,记为 X,并以下列格式输出 “X employees worked more than 15 hours.”
- 使用特殊变量 NR、NF,统计输出整个文本的行数、单词数和字符数
将内容保存为data.txt后,输入:
1.
cat data.txt | awk '$3 >0 {print $1,$2*$3}'
2.
awk -v i=0 '$3>15{i++}END{print i,"employees worked more than 15 hours."}' data.txt
3.
这次使用方法五,首先写好可执行文件p13
#!/usr/bin/awk -f
{
nc = nc + length($0) +1
nw = nw +NF
}
END {print NR," lines,",nw," words,",nc," characters."}
chmod +x p13
cat data.txt | ./p13
2.使用awk统计/etc/passwd文件中
(1)登陆shell为“/sbin/nologin”的用户个数
(2)用户名包含'g'的用户,打印出用户名和UID
(1)cat /etc/passwd | awk -F : -v i=0 '{if($NF=="/usr/sbin/nologin") i=i+1;}END{print i}'
(2)cat /etc/passwd | awk -F : '{print $1,$3}' | awk -F : '/.*g.*/ {print $1,$2}'
这里用到了正则表达式,若不清楚,请君查看正则表达式相关内容
3.使用awk统计当前文件夹下,文件总的大小
ls -l | awk -v size=0 '{size+=$5}END{print "total size:",size,"Bytes"}'
ls -l 命令执行结果:
第五列是文件大小信息,因此直接读取相加即可。