Shell编程四剑客之AWK

        AWK是一个优良的文本处理工具,LinuxUnix环境中现有的功能最强大的数据处理引擎之一,以Aho、Weinberger、Kernighan三位发明者名字首字母命名为AWK,AWK是一个行级文本高效处理工具,AWK经过改进生成的新的版本有Nawk、Gawk,一般Linux默认为Gawk,Gawk是 AWK的GNU开源免费版本。

       AWK基本原理是逐行处理文件中的数据,查找与命令行中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容,则继续处理下一行。其语法参数格式为,AWK常用参数、变量、函数详解如下:

awk    'pattern   +   {action}'     file

(1)、AWK基本语法参数详解:

单引号' '是为了和shell命令区分开;

大括号{ }表示一个命令分组;

pattern是一个过滤器,表示匹配pattern条件的行才进行Action处理;

action是处理动作,常见动作为Print;

使用#作为注释,pattern和action可以只有其一,但不能两者都没有。

(2)、AWK内置变量详解:

FS 分隔符,默认是空格;

OFS 输出分隔符;

NR 当前行数,从1开始;

NF 当前记录字段个数;

$0 当前记录;

$1~$n 当前记录第n个字段(列)。

(3)、AWK内置函数详解:

gsub(r,s):在$0中用s代替r;

index(s,t):返回s中t的第一个位置;

length(s):s的长度;

match(s,r):s是否匹配r;

split(s,a,fs):在fs上将s分成序列a;

substr(s,p):返回s从p开始的子串。

(4)、AWK常用操作符,运算符及判断符:

++ --                            增加与减少( 前置或后置);

^ **                            指数( 右结合性);

! + -                             非、一元(unary) 加号、一元减号;

+ - * / %                       加、减、乘、除、余数;

< <= == != > >=                        数字比较;

&&                            逻辑and;

||                                 逻辑or;

= += -= *= /= %= ^= **=             赋值。

(5)、AWK与流程控制语句:

if(condition) { } else { };

while { };

do{ }while(condition);

for(init;condition;step){ };

break/continue。

常用AWK工具企业演练案列:

(1)、AWK打印硬盘设备名称,默认以空格为分割:

df    -h|awk  '{print  $1}'

(2)、 AWK以空格、冒号、\t、分号为分割:

awk  -F '[ :\t;]'  '{print  $1}'            file.txt

(3)、AWK以冒号分割,打印第一列,同时将内容追加到/tmp/awk.log下:

awk  -F:  '{print $1 >>"/tmp/awk.log"}'  file.txt

(4)、打印file.txt文件中的第3行至第5行,NR表示打印行,$0表示文本所有域:

awk 'NR==3,NR==5  {print}'             file.txt

awk 'NR==3,NR==5  {print $0}'          file.txt

(5)、 打印file.txt文件中的第3行至第5行的第一列与最后一列:

awk 'NR==3,NR==5 {print $1,$NF}'       file.txt

(6)、 打印file.txt文件中,长度大于80的行号:

awk   'length($0)>80 {print NR}'        file.txt

(7)、AWK引用Shell变量,使用-v或者双引号+单引号即可:

awk -v STR=hello  '{print STR,$NF}'      file.txt

STR="hello";echo| awk  '{print "'${STR}'";}'

(8)、AWK以冒号切割,打印第一列同时只显示前5行:

cat  /etc/passwd|head -5|awk  -F:   '{print $1}'

awk  -F:  'NR>=1&&NR<=5  {print $1}'  /etc/passwd

(9)、AWK与数组组合实战,统计passwd文件用户数:

awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}'  /etc/passwd

(10)、awk分析Nginx访问日志的状态码404、502等错误信息页面,统计次数大于20的IP地址。

awk '{if ($9~/502|499|500|503|404/) print $1,$9}' access.log|sort|uni–c|sort –nr | awk '{if($1>20) print $2}'

(11)、用/etc/shadow文件中的密文部分替换/etc/passwd中的"x"位置,生成新的/tmp/passwd文件。

awk 'BEGIN{OFS=FS=":"} NR==FNR{a[$1]=$2}NR>FNR{$2=a[$1];print >>"/tmp/passwd"}' /etc/shadow /etc/passwd

(12)、企业面试题:Awk统计服务器状态连接数:

netstat -an | awk '/tcp/ {s[$NF]++} END {for(a in s) {print a,s[a]}}'

netstat -an | awk '/tcp/ {print $NF}' | sort | uniq -c

(13)、企业面试题:file.txt里面以”:”为分隔符,区域3大于15,一共有多少行?

awk -F ":" '$3>15{a=a+1}END{print a}' file.txt   

awk -F ":" '$3>15{a++}END{print a}' file.txt

(14)、企业面试题:统计web日志单ip访问请求数排名

awk '{S[$1]++}END{for(k in S) print "    "S[k],k}' access.log |sort -rn -k2|head

(15)、企业面试题:统计企业工作中高并发web服务器不同网络连接状态对应的数量

awk '/^tcp/ {S[$NF]++}END{for(k in S) print S[k],k}' netstat.log |sort -rn|head 

awk '/^tcp/ {print $NF}' netstat.log|sort|uniq -c|sort -rn|head

 

posted @ 2019-11-19 14:40  走天涯123  阅读(184)  评论(0编辑  收藏  举报