shell编程四剑客之AWK

awk是一个优良的文本处理工具,Linux及UNIX环境中现有的功能最强大的数据处理引擎之一,以Aho、Weinberger、Kernighan三位发明者名字首字母命名为awk,awk是一个行级文本高效处理工具,awk经过改进生成的新的版本有nawk、gawk,一般Linux默认为gawk,gawk是awk的GNU开源免费版本。
awk基本原理是逐行处理文件中的数据,查找与命令行中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容,则继续处理下一行。其语法参数格式如下:

在这里插入图片描述
awk常用参数、变量、函数详解如下。
(1)awk基本语法参数详解如下:
•□单引号’'是为了和shell命令区分开。
•□大括号{}表示一个命令分组。
•□pattern是一个过滤器,表示匹配pattern条件的行才进行action处理。
□action是处理动作,常见动作为print。
•□使用#作为注释,pattern和action可以只有其一,但不能两者都没有。
常用命令选项
-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令
-m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
(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。
(6)BEGIN 和 END 模块
通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,在许多编程情况中, 可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk 允许 您定义一个 BEGIN 块。我们在前一个示例中使用了 BEGIN 块。因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它 在程序中以后会引用的全局变量的极佳位置。
awk 还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有行之后执行 这个块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。
BEGIN{}: 读入第一行文本之前执行的语句,一般用来初始化操作
{}: 逐行处理
END{}: 处理完最后以行文本后执行,一般用来处理输出结果
实例:
文件开头加REDHAT,末尾加WESTOS,打印行号和内容
[root@localhost]# awk -F: ‘BEGIN {print “REDHAT”} {print NR;print} END {print “WESTOS”}’ passwd
统计文本总字段个数
[root@server19 mnt]# awk ‘BEGIN{i=0}{i+=NF}END{print i}’ test.txt

(1)awk打印硬盘设备名称,默认以空格为分割,代码如下:
df -h|awk ‘{print $1}’
df -h | awk -F"" ‘{print $2}’
(2)awk以空格、冒号、\t、分号为分割,代码如下:
awk -F ‘[ ;\t: ]’ ‘{print $1}’ 2.txt
(3)awk以冒号分割2.txt,打印第一列,同时将内容追加到/tmp/awk.log下,代码如下:
awk -F: ‘{print $2}’ 2.txt >> /tmp/awk.log
(4)打印1.txt文件中的第3行至第5行,NR表示打印行,$0表示文本所有域,代码如下:
awk ‘NR>=3&&NR<=5’ 1.txt
awk ‘NR3,NR5’ 1.txt
(5)打印5.txt文件中的第3行至第5行的第一列与最后一列,代码如下:
awk ‘NR>=3&&NR<=5 {print 1 , 1, 1,NF}’ 5.txt
(6)打印3.txt文件中长度大于20的行号,代码如下:
awk ‘length($0)>20 {print NR}’ 3.txt
(7)awk引用shell变量,使用-v或者双引号+单引号即可,代码如下:
str=hello | echo KaTeX parse error: Expected '}', got 'EOF' at end of input: … awk '{print "'{str}’"}’
(8)awk以冒号切割,打印第一列同时只显示前3行,代码如下:
awk -F: ‘NR<=3 {print $1}’ 2.txt
(9)awk指定文件5.txt第一列的总和,代码如下:
cat 5.txt | awk ‘{sum+=$1} END{print sum}’
(10)awk NR行号除以2余数为0则跳过该行,继续执行下一行,打印在屏幕,代码如下:
awk -F: ‘NR%20 {next} {print NR,$1}’ /etc/passwd
awk 'NR%2
0 {next} {print NR,$0}’ /etc/passwd
(11)awk添加自定义字符,代码如下:
1、
ifconfig eth0|egrep “Mask| Bcast”|awk ‘{print $2}’|awk -F: ‘{print $2}’
ifconfig eth0|egrep “Mask| Bcast”|awk ‘{print $2}’|sed ‘s/addr://g’
2、
awk -F"" ‘NR==1 {next} {print “你是-”$2}’ 5.txt
(12)awk格式化输出passwd内容,printf打印字符串,%格式化输出分隔符,s表示字符串类型,-12表示12个字符,-6表示6个字符,代码如下:
awk -F: ‘{printf “% -17s% -6s% -15s\n”,$1, 2 , 2, 2,NF}’ /etc/passwd
(13)awk OFS输出格式化\t,代码如下:
1、
awk -F: ‘{print $1, 2 , 2, 2,NF }’ OFS="\t" /etc/passwd
2、
netstat -an | awk ‘/LISTEN/&&NR>=1&&NR<=10 {print NR,$4,$5,$6}’ OFS="\t"
(14)awk与if组合实战,判断数字比较,代码如下:
echo 3 2 1 | awk ‘{if(($1>$2)||($3>$2)) {print $2} else {print $1}}’
(15)awk与数组组合实战,统计passwd文件用户数,代码如下:
awk -F: ‘BEGIN{count=0} {count++}END{print "用户数为"count}’ /etc/passwd
(16)awk分析Nginx访问日志的状态码404、502等错误信息页面,统计次数大于20的IP地址,代码如下:
sort aa.txt|uniq -c|sort -nr|awk -F"" ‘{if($1>=2) {print $2}}’
(17)用/etc/shadow文件中的密文部分替换/etc/passwd中的“x”位置,生成新的/ tmp/passwd文件,代码如下:

(18)awk统计服务器状态连接数,代码如下:

答案:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值