awk

 
AWK是一个优良的文本处理工具,LinuxUnix环境中现有的功能最强大的数据处理引擎之一,以Aho、Weinberger、Kernighan三位发明者名字首字母命名为AWK,AWK是一个行级文本高效处理工具,AWK经过改进生成的新的版本有Nawk、Gawk,一般Linux默认为Gawk,Gawk是 AWK的GNU开源免费版本。
AWK基本原理是逐行处理文件中的数据,查找与命令行中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容,则继续处理下一行。其语法参数格式为,AWK常用参数、变量、函数详解如下:
 
AWK基本语法参数详解
单引号' '是为了和shell命令区分开;
大括号{ }表示一个命令分组;
pattern是一个过滤器,表示匹配pattern条件的行才进行Action处理;
action是处理动作,常见动作为Print;
使用#作为注释,pattern和action可以只有其一,但不能两者都没有。

AWK内置变量详解

FS 分隔符,默认是空格;
OFS 输出分隔符;
NR 当前行数,从1开始;
NF 当前记录字段个数,$NF 显示最后一行
$0 当前记录;
$1~$n 当前记录第n个字段(列)。

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开始的子串。

AWK常用操作符,运算符及判断符

++ --                         增加与减少( 前置或后置);
^ **                           指数( 右结合性);
! + -                           非、一元(unary) 加号、一元减号;
+ - * / %                     加、减、乘、除、余数;
< <= == != > >=                      数字比较;
&&                      逻辑and;
||                          逻辑or;
= += -= *= /= %= ^= **=          赋值。

AWK与流程控制语句

if(condition) { } else { };
while { };
do{ }while(condition);
for(init;condition;step){ };
break/continue。

 

常用AWK工具企业演练案列

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

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

 

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

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

 

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

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

 

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

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

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

 

打印1.txt文件中的第3行至第5行的第一列与最后一列:

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

 

打印1.txt文件中,长度大于80的行号:

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

 

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

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

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

 

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

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

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

 

Awk指定文件1.txt第一列的总和:

cat 1.txt |awk '{sum+=$1}END{print sum}'

 

AWK NR行号除以2余数为0则跳过该行,继续执行下一行,打印在屏幕:

awk -F: 'NR%2==0 {next} {print NR,$1}' /etc/passwd

 

AWK添加自定义字符:

ifconfig eth0|grep "Bcast"|awk '{print "ip_"$2}'

 

AWK与if组合实战,判断数字比较:

echo 3 2 1 | awk '{ if(($1>$2)||($1>$3)) { print $2} else {print $1} }'

 

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

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

 

Awk统计服务器状态连接数:
netstat -an | awk '/tcp/ {print $NF}' | sort | uniq -c

 
打印第二行和倒数第二行
df -h | awk 'NR>1&&NR<3||NR==8 {print $0}'
awk增加前缀 awk '{print "kill -9",$0}'

 

 

 
 
 
 
 
 
 
 
 
posted @ 2022-10-11 09:08  此生逍遥py  阅读(85)  评论(0)    收藏  举报