一、AWK基本用法

  事例一

wKioL1M80pXAAfzqAAEF-FTdrug880.jpg


   1、打印文档中的所有内容

 方法一:awk '{print;}' awktest.txt

wKioL1M80qnSh5X_AAEBeETNlW4423.jpg

    方法二:awk '{print $0}' awktest.txt

wKiom1M80uvTWq0LAAEBHWFqPmc034.jpg


2、提取ThomasJasonRandy的数据。

#awk '/Thomas/

 > /Jason/

> /Randy/' awktest.txt

wKioL1M80tfihZkBAADW0HGkIRo800.jpg


 3、打印第2列、第5

 方法一:awk '{print $2,$5}' awktest.txt

wKiom1M80xPh34EgAACO4fROYzU388.jpg


方法二:awk '{print $2,$NF}' awktest.txt

wKioL1M80vyCA6zSAACGMmzkpks588.jpg

备注:$NF 指最后一列。


 4、在文档的开头和结尾处加上注释

# awk 'BEGIN {print "employee name"}

  > {print;}

  > END {print "wages"}' awktest.txt

wKiom1M801jTzHrMAAF1VdyE54k916.jpg


5、找出ID大于300的员工姓名

awk '$1>300' awktest.txt

wKioL1M800bAwl__AACC5oMx7AE723.jpg


6、统计技术部门员工人数

awk 'BEGIN {count=0;} $4 ~ /Technology/ {count++;} END {print count}' awktest.txt

wKioL1M803XRikEcAABSjkNxAis268.jpg


7、找出/etc/passwd 里面的用户名及配置文件并分开显示

awk -F ":" '{print $1,$NF}' /etc/passwd

wKioL1M83imTVFDmAAGKhY8IS5w044.jpg


二、正则表达式

1、在配置文件和用户名前加上注释并隔行显示。

awk -F ":" '{print "username:\t"$1,"\n\profile:\t" $NF "\n";}' /etc/passwd

wKioL1M83j-g_OAyAAD7opq0Tz4764.jpg

备注:\t 空格 \n另起一行


事例二

wKioL1M83leRZS6HAAEEyFr2yPk775.jpg

2、去掉不包含“Brown”的字段的行

awk '$0 !~ /Brown/' grade.txt

wKiom1M83o_xQJTeAACn69Bk2xc696.jpg

3、找出第六列值不大于第七列值的内容。

awk '$6 <= $7' grade.txt

wKiom1M83qPjwyAUAACpUG7Lm5w300.jpg


4、找出第一列中第3个字符是“U”的数据

awk '$1 ~ /^...u/' grade.txt

wKiom1M83s_iwCL5AACJYCChDtQ099.jpg


5、找出含有Yellow或者Brown字段的内容

awk '$0 ~ /Yellow|Brown/' grade.txt

wKioL1M83riytEBmAAC-qbBNSR0818.jpg


三、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

wKioL1M83tDC7iW1AAEzpNbO8b0781.jpg


2、通过变量提取第6列值小于27的数据

awk 'BEGIN {date=27} ($6<date)' grade.txt

wKiom1M83wrTWDXTAACQdoOpm9I090.jpg


3、找出第一列中含有“e”字段的数据,并将第6列值-10,并显示167列数据。

awk '{if($1 ~ /e/) $6=$6-10; print $1,$6,$7 }' grade.txt

wKiom1M83xyyQVLXAAG4des0j48597.jpg


4、统计第六列总数并只显示结果

awk '{(total+=$6)}; END {print total}' grade.txt

wKioL1M83wWhA937AABgWBEivvo988.jpg

注:去掉{},则将数据全部显示出来,见下图。


四、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

wKioL1M83yuhiG2tAADhKP2Is-c368.jpg

2、查询“green”中的n在第几个位置

awk 'BEGIN{print index("green","n")}'grade.txt

注:如BEGIN若不加,则每行都回显示5

wKiom1M834Lx2MkzAACDQGLDkQU324.jpg

3、计算第一列字符串长度并用连接符连接

awk '{printlength($1)"--------"$1}' grade.txt

wKioL1M832rABeS7AACs3HZGKP0914.jpg


4、若第一列中含有“l”则告知位置,若没有则返回0

awk'{print match($1,"l")"------" $1}' grade.txt

wKiom1M836WQdT_lAACe-mpHSUk058.jpg


5、只列出第一个域中35位字符串

awk'{print substr($1,3,3)}' grade.txt

wKioL1M834uDFq4sAABregV4C14123.jpg