lakers009 发表于 2018-8-26 07:30:27

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]
查看完整版本: shell-awk高级应用