shell-awk高级应用
awk一、awk简介
脚本语言
变量 ..... 流程控制 数组函数
主要使用awk做数据统计
1 统计系统内建用户个数、外建用户个数
2 统计网站服务器 当天的访问量 access_log
3 每周一给邮箱使用空间最大的前10个邮箱帐号发提醒邮件
4 把当前系统10分钟内cpu使用率最高的前10个进程名输出
在shell脚本里
使用awk获取数据给shell程序处理。
每5分钟检查一下当前系统根分区的使用量,根分区的空闲空间小 于10G时,向当前系统所有终端发送报警信息
----------------------------------------------------------------------
awk语法格式 (rpm -q gawk)
awk '动作' 文件列表
awk 选项 '条件动作' 文件列表
命令| awk 选项 '条件动作'
---------------------------------------------------------------------
awk 执行过程?
以行为处理单位,逐行处理文件中的所有行,输出当前行的处理结果后自动处理下一行,直到把所有行处理完为止。
----------------------------------------------------------------------
选项?
-F"符号" 指定列的分割符号 awk默认使用空格或\tab作为列的分隔符
----------------------------------------------------------------------
awk变量的使用 (内置变量 自定义变量 调用shell)
1、 内置变量
$0当前读入的整行文本内容
FNR 保存当前处理行在原文本内的序号(行号)
NR 记录当前已读入行的数量(行数)
FILENAME当前处理文件的文件名
NF 记录当前处理行的字段个数(列数)域$n 指定分隔的第n个字段,如$1、$3分别表示第1、第3列
FS 保存或设置字段分隔符 空格\tab
awk '{print FNR}' a.txt
awk '{print NR,FNR}' a.txt
awk '{print FILENAME}' a.txtb.txt
head /etc/passwd | awk -F ":" '{print $1}'
head /etc/passwd | awk -F ":" '{print $1,$3}'
awk '{print $0}' a.txt
awk '{print "abc"}' a.txt
df -h | grep /boot$ | awk '{print $1}'
echo9G | awk -F "[.G]" '{print $1}'
echo3.5G | awk -F "[.G]" '{print $1}'
2 自定义变量
变量名=值
awk '{i=101;name="lucy";print i,name}' a.txt
awk '{i=101;name="lucy";print “i,name”}' a000.txt
3 awk调用shell变量
36name1=lucyname2=tom
37echo $name1 $name2
38awk -v x=$name1 -v y=$name2 '{print x,y}' a.txt
# x=203
# awk'{print '$x' }' a.txt
203
203
203
#
# awk -v y=$x '{printy }' a.txt 调用变量时-v *=$*
203
203
203
#
ENVIRON 调用Shell环境变量,格式:ENVIRON["变量名"]
awk -v y=$HOSTNAME '{print y}' a.txt
echo $USER $HOSTNAME
awk'{print ENVIRON["USER"]}' a.txt
awk'{print ENVIRON["HOSTNAME"]}' a.txt
------------------------------------------------------------------
在执行sed命令时,调用shell自定义变量
45sed -n '1,3p' a.txt
46x=1 y=3
47echo $x $y
49sed -n ' '$x','$y'p ' a.txt
----------------------------------------------------------------------
awk处理数据的顺序?
awk ''a.txt
awk ' {}'a.txt
awk 'BEGIN{}{}'a.txt
awk '{}END{}'a.txt
awk 'BEGIN{}{}END{}'a.txt
BEGIN{ }行前处理
做数据的初始化定义
82awk -F ":" '{print $1}' a.txt
83awk 'BEGIN{FS=":"}{print $1}' a.txt
{ } 行处理
对每一行执行的命令 多个命令用;间隔
END{ } 行后处理
把文件中所有行都处理完后,执行的命令
适合做数据的总结行输出
71awk '{print $0}END{print $0}' a.txt
73awk 'END{print $0}' /etc/passwd
74useradd bob
75awk 'END{print $0}' /etc/passwd
77awk '{print FNR,$0}' a.txt
78awk 'BEGIN{print FNR}{print FNR}END{print FNR}' a.txt
awk 'END{print "文件"FILENAME"的行数是"NR"行"}' /etc/passwd
awk 'BEGIN{FS=":";print "user\tuid\thome"}{print $1"\t",$3"\t",$6}END{print"sum lines is"NR}'a.txt
awk -F ":" '{print $1"\t",$3"\t",$6}END{print"sum lines is"NR}'a.txt | sed'1iuseruid home'
-------------------------------------------------------------------
awk条件的表示方式?
awk'{print$0}'a.txt
awk'条件{print$0}'a.txt
数值比较
num1 符号 num2
==等于 != 不等于
> 大于 >= 大于或等于
< 小于 a.txt
1004awk'{exit}' a.txt
1005awk'FNR==3{exit}{print FNR,$0}' a.txt
1006awk'FNR==3{next}{print FNR,$0}' a.txt
1007awk'{next}{print FNR,$0}' a.txt
1008awk'{print FNR,$0}{next}' a.txt
--------------------------------------------------------------
# cat c.txt
eth0 Link encap:EthernetHWaddr 00:0C:29:B6:48:A6
encap:EthernetHWaddr 00:0C:29:B6:48:A6
#
awk 'NF
页:
[1]