awk编程语言/数据处理引擎
创造者:Aho、Weinberger、Kernighan 基于模式匹配检查输入文本,逐行处理并输出 通常用在Shell脚本中,获得指定的数据 单独用时,可对文本数据做统计
基本用法
语法格式
前置命令 | awk [选项] ‘[条件]{编辑指令}‘ awk [选项] ‘[条件]{编辑指令}‘ 文件 在编辑指令中,若有多条语句,可用分号分隔,print是最常用的指令
常用命令选项
命令选项 注释 -F 指定分隔符,可省略(默认空格或Tab位);符号分隔需要用双引号""括起来 -f 调用awk脚本进行处理 -v 调用外部Shell变量
处理动作
print 打印,相当于shell中的echo , 多个参数用逗号分隔 ; 多个动作用分号;分隔
awk执行过程
以行为处理单位 对数据进行逐行处理 处理完当前行,把当前行的处理结果输出后自动对下一行进行处理 直到文件中所有行处理完为止
awk内置变量
直接含义,可直接使用
调用变量的时候不用$符号标示,直接调用就可以
变量 用途 FILENAME 当前处理文件的文件名 $0 当前读入的整行文本内容 NR 记录当前已读入行的数量(行数) FNR 保存当前处理行在原文本内的序号(行号) NF 记录当前处理行的字段个数(列数) $n 指定分隔的第n个字段,如$1、$3分别表示第1、第3列 FS 保存或设置字段分隔符,例如FS=":" ENVIRON 调用Shell环境变量,格式为:ENVIRON["变量名"]
awk处理时机
BEGIN{}:行前处理 读入第一行文本之前执行;一般用来初始化操作 可选操作,可以有多个 { }:逐行处理 逐行读入文本执行相应的处理;可选操作 是最常见的编辑指令块 END{}:行后处理 处理完最后一行文本之后执行;可选项 一般用来输出处理结果
注意:可单独使用,也可同时使用
例子: awk‘BEGIN{FS=":";print NR} {print NR,$0}END{print NR}‘ a.txt
awk处理条件
默认awk对读入的每行进行处理,如想只处理指定行时就需要加要条件判断。
awk [选项] ‘[条件]{处理动作}‘ 文件
条件的表现形式
正则表达式 数值或字符串比较 逻辑比较 运算符
使用正则条件
~匹配:结果匹配正则表达式为真 !~不匹配:结果不匹配正则表达式为真
使用数值比较
操作符 含义 == 等于;用于字符比较时要加 "" 双引号 != 不等于;用于字符比较时要加 "" 双引号 > 大于 >= 大于或等于 < 小于 <= 小于或等于
逻辑比较
操作符 &&逻辑与 期望多个条件都成立 ||逻辑或 只要有一个条件成立即满足要求
变量的运算
运算符 +、-、*、/、% ++、--、+=、-=、*=、/= ^或**(乘方)
awk流程控制
awk流程控制分类
分支结构
单分支 双分支 多分支
循环结构
while do...while for
分支结构
单分支
if(条件){编辑指令}
例子:
awk -F ":" ‘{if($3==1){print $0;print NR}}‘ /etc/passwd
双分支
if(条件){编辑指令1}else{编辑指令2}
例子:
awk -F":" ‘{ if($3<500){i++}else{j++} }END{print i;print j }‘ /etc/passwd
多分支
if(条件){编辑指令1}else{编辑指令2}....else{编辑指令N}
while循环结构
while循环
while (条件){编辑指令}
do while循环
do{编辑指令}while(条件)
for循环结构
for循环
for(初值;条件;步长){编辑指令}
例题:
awk ‘BEGIN{for(i=0;i<=10;i++){print i}}‘
主要的控制语句
关键字 含义 break 结束当前的循环体 continue 中止本次循环,转入下一次循环 next 跳过当前行,读入下一行文本开始处理 exit 结束文本读入,转入END{}执行 如果没有END{}则直接退出awk处理操作
用awk脚本处理文件 [[email protected] ~]# cat test.awk #!/bin/awk -f BEGIN{ FS=":" i=0 j=0 } { if($3<500){ i++ }else{ j++ } } END{ print "系统内建用户有 " i " 个" print "系统外建用户有 " j " 个" } 例题: awk -F":" ‘{ while($3<3){print $1,$3;$3++} }‘ /etc/passwd awk -F":" ‘{while($3<3){print $1,$3;$3=3}}‘ /etc/passwd awk ‘BEGIN{ i=1;while(i<=10){if(i%2==0){print i};i++} }‘ awk ‘BEGIN{i=0}{i++}END{print i}‘ /etc/passwd 用awk统计文件数据 vim testa.awk #!/bin/awk -f BEGIN{ FS=":" i=0 j=0 } { if($3<500){ i++ }else{ j++ } } END{ print i print j }
awk数组
定义数组
数组名[数组元素下标]=元素值
输出数组元素print
数组名[数组元素下标]
如:
awk -F ":" ‘{usergrp[$3]=$1;print usergrp[$3]}‘ /etc/passwd awk ‘BEGIN{usergrp[0]="yzs";usergrp[1]="lucy";print usergrp[0]}‘
遍历(输出)数组的循环结构:
for(变量名 in 数组名){print 数组名[变量]}
例子:
awk ‘BEGIN{usergrp[0]="yzs";usergrp[1]="lucy";for( i in usergrp){print usergrp[i]}}‘ awk ‘BEGIN{ for(i=1;i<=10;i++){name[i]=i};for(j in name){print name[j]} }‘
数组作业:
把当前系统使用频率最高的前10条命令输出
awk ‘{ comm[$1]++}END{for( i in comm){print i,comm[i]}}‘ /root/.bash_history | sort -rnk 2 | head
其中各个命令的含义:
comm[$1]++} :$1是文件中的第一列 ++ 当第一列数据相同时自加1 END{for( i in comm) {print i,comm[i]}}‘ /root/.bash_history | sort -rnk 2 | head
2 、输出当前系统1小时内占用CPU最多的前10个进程
#!/bin/bash for((i=0;i<60;i++)) do ps -eo comm,pcpu | tail -n +2 >> /tmp/top10.txt sleep 60 done awk ‘{ process[$1]+=$2}END{for( j in process){ print i,process[i]}}‘ /tmp/top10.txt | sort -rnk 2 | head
awk练习题:
1、只显示uid是501的用户的详细信息 awk -F ":" ‘$3=="501"{print $0}‘ /etc/passwd 2、输出文件中偶数行的内容 awk ‘FNR%2!=1{print $0}‘ a.txt 3、统计系统内有多少个用户不能登录系统 awk -F ":" ‘$7~"no"{print $0;i++}END{print i}‘ /etc/passwd 4、1-100间 是7的倍数或是含7的数显示出来 awk ‘FNR%7==0{print $0}{print FNR}‘ /etc/passwd 5、统计当前系统有多少个内建帐户 6、统计当前系统有多少个自定义帐户 awk -F ":" ‘BEGIN{i=0;j=0}$3<500{i++}$3>=500{j++}END{print "uid 小于 500的用户有 "i"个";print "uid 大于等于 500的用户有"j"个"}‘ /etc/passwd 7、把用户名含数字的用户信息输出 awk -F ":" ‘$1~/[0-9]/{print $0}‘ aa.txt 8、显示前5个系统用户的用户名、uid、shell
原文地址:https://www.cnblogs.com/zhongguiyao/p/8996074.html
时间: 2024-10-18 07:12:43