Source:
1.Linux awk命令详解
2. linux awk命令详解
3.linux-shell脚本命令之awk
4.awk文本处理总结(入门,中级,高级)
5.Learning Linux Commands: awk 有很多例子
6. AWK 非常详细的教程
grep 算是查找命令,sed 是编辑,awk 是一个更强大的文本分析工具。
awk 是逐行读入,以空格为默认分隔符切片,切片的部分再进行各种处理。可以把awk认为是一种轻量级的编程语言。
它以文件的一行为处理单位,每接受一行,执行相应的命令,来处理文本
basic syntax
awk [-F field-separator] ‘command’ filename
[-F field-separator] 可选参数
‘command’ : command 必须用apostrophe括起
Example
Basic
awk ‘{print $1}’
输出第一列, ( 0代表所有列, 1代表第1列, 以空格分割)
awk -F ‘:’ ‘{print $1}’
-F ‘:’, 以 colon 分割
awk -F ‘:’ ‘BEGIN {print “name, shell”} {print 1"," 7} END{print “blue, /bin/nosh”}
Begin 会再最开始输出,End 会最后输出
awk -F: ‘/root/{print &7}’ /etc/passwd
这个是使用pattern的例子,匹配了pattern(这里是root)的行才会执行action(如果没有action,就会默认输出每行的内容)。 这里把匹配root的行的第7列输出来
awk 内置变量
ARGC: 命令行参数个数
ARGV: 命令行参数排列
ENVIRON: 支持队列中系统的环境变量的使用
FILENAME: awk 浏览的文件名
FNR: 浏览文件的记录数
FS: 设置输入域分割符,等价于命令行 -F 选项
NF: 浏览记录的域的个数
NR: 已读的记录数
OFS: 输出域分隔符
ORS:输出记录分隔符
RS:控制记录分隔符awk -F ‘:’ ‘{print “filename:” FILENAME, “,linenumber:” NR “,columns:” NF “,linecontent:” $0}’
也可以使用 printf
awk -F ‘:’ ‘{printf(“filename:%10s, linenumber:%s, column:%s, linecontent:%s\n”,FILENAME, NR,NF,$0)}’
变量和赋值
可以自定义变量
awk ‘BEGIN{count =0} {count++;print $0;} END{print “user count is “, count}’ filename
count 是自定义变量。 action { } 可以有多个语句,用;分开
ls -l | awk ‘BEGIN {size=0;} {size=size+$5} END{print “[end] size is “,size}’
统计某个文件夹下的文件占用的字节数
ls -l | awk ‘BEGIN {size=0;} {size=size+$5} END{print “[end] size is “,size/1024/1024, “M”}’
ls -l | awk ‘BEGIN {size=0;}{ if($5!=4096){size = size + $5;} } END{print “[end] size is “,size/1024/1024, “M”}’
awk 还支持循环语句,支持 while, do/while, for, break, continue. 这些关键字的语义和C语言的语义完全相同
awk -F ‘:’ ‘BEGIN {count=0;}{name[count]=$1; count++;} END{ for(i=0;i\< NR;i++) print i,name[i] }’ filename
awk ‘NR==4, NR==6’
打印 4 到 6 行
awk ‘$2 ~ /^sa/’ filename
只检查第2列是不是符合 /^sa/ 的匹配