一、AWK基本用法
事例一
1、打印文档中的所有内容
方法一:awk '{print;}' awktest.txt
方法二:awk '{print $0}' awktest.txt
2、提取Thomas、Jason、Randy的数据。
#awk '/Thomas/
> /Jason/
> /Randy/' awktest.txt
3、打印第2列、第5列
方法一:awk '{print $2,$5}' awktest.txt
方法二:awk '{print $2,$NF}' awktest.txt
备注:$NF 指最后一列。
4、在文档的开头和结尾处加上注释
# awk 'BEGIN {print "employee name"}
> {print;}
> END {print "wages"}' awktest.txt
5、找出ID大于300的员工姓名
awk '$1>300' awktest.txt
6、统计技术部门员工人数
awk 'BEGIN {count=0;} $4 ~ /Technology/ {count++;} END {print count}' awktest.txt
7、找出/etc/passwd 里面的用户名及配置文件并分开显示
awk -F ":" '{print $1,$NF}' /etc/passwd
二、正则表达式
1、在配置文件和用户名前加上注释并隔行显示。
awk -F ":" '{print "username:\t"$1,"\n\profile:\t" $NF "\n";}' /etc/passwd
备注:\t 空格 \n另起一行
事例二
2、去掉不包含“Brown”的字段的行
awk '$0 !~ /Brown/' grade.txt
3、找出第六列值不大于第七列值的内容。
awk '$6 <= $7' grade.txt
4、找出第一列中第3个字符是“U”的数据
awk '$1 ~ /^...u/' grade.txt
5、找出含有Yellow或者Brown字段的内容
awk '$0 ~ /Yellow|Brown/' grade.txt
三、AWK内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行-F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出例句分隔符
RS 控制记录分隔符
1、在文本内容前面增加2列,用于显示列数和行数,并在结尾显示文件名
awk '{print NF,NR,$0} END {print FILENAME}' grade.txt
2、通过变量提取第6列值小于27的数据
awk 'BEGIN {date=27} ($6<date)' grade.txt
3、找出第一列中含有“e”字段的数据,并将第6列值-10,并显示1,6,7列数据。
awk '{if($1 ~ /e/) $6=$6-10; print $1,$6,$7 }' grade.txt
4、统计第六列总数并只显示结果
awk '{(total+=$6)}; END {print total}' grade.txt
注:去掉{},则将数据全部显示出来,见下图。
四、awk 内置字符串函数
gsub(r,s) 在整个$0中用s替代r
gsub(r,s,t) 在整个t中使用s替代r
index(s,t) 在返回s中字符串t的第一个位置
length(s) 放回s长度
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs) 在fs上将s分成序列a
sprint(fmt,exp) 返回经fmt格式化后的exp
sub(r,s) 用$0中最左边最长的子串代替s
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
1、将文本中“48”更改成“32”
awk 'gsub(/48/,32) {print $0}' grade.txt
2、查询“green”中的n在第几个位置
awk 'BEGIN{print index("green","n")}'grade.txt
注:如BEGIN若不加,则每行都回显示5
3、计算第一列字符串长度并用连接符连接
awk '{printlength($1)"--------"$1}' grade.txt
4、若第一列中含有“l”则告知位置,若没有则返回0
awk'{print match($1,"l")"------" $1}' grade.txt
5、只列出第一个域中3到5位字符串
awk'{print substr($1,3,3)}' grade.txt
本文出自 “上尚若水” 博客,谢绝转载!