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.txt  b.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}‘

echo  9G | awk -F "[.G]" ‘{print $1}‘
echo  3.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变量
   36  name1=lucy  name2=tom
   37  echo $name1 $name2
   38  awk -v x=$name1 -v y=$name2 ‘{print x,y}‘ a.txt

[[email protected] ~]# x=203
[[email protected] ~]# awk  ‘{print ‘$x‘ }‘ a.txt
203
203
203
[[email protected] ~]#

[[email protected] ~]# awk -v y=$x ‘{print  y }‘ a.txt   调用变量时-v *=$* 
203
203
203
[[email protected] ~]#

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自定义变量
   45  sed -n ‘1,3p‘ a.txt
   46  x=1 y=3
   47  echo $x $y
   49  sed -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{   }  行前处理
                  做数据的初始化定义
   82  awk -F ":" ‘{print $1}‘ a.txt
   83  awk ‘BEGIN{FS=":"}{print $1}‘ a.txt

{    }            行处理
                  对每一行执行的命令   多个命令用;间隔

END{   }     行后处理
                  把文件中所有行都处理完后,执行的命令
                  适合做数据的总结行输出

71  awk ‘{print $0}END{print $0}‘ a.txt
     73  awk ‘END{print $0}‘ /etc/passwd
   74  useradd bob
   75  awk ‘END{print $0}‘ /etc/passwd
      77  awk ‘{print FNR,$0}‘ a.txt
   78  awk ‘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  ‘1iuser  uid   home‘

-------------------------------------------------------------------
awk条件的表示方式?
awk  ‘{print  $0}‘  a.txt
awk  ‘条件{print  $0}‘  a.txt

数值比较
num1   符号   num2
==  等于    != 不等于    
> 大于      >= 大于或等于

< 小于     <= 小于或等于
  975  awk  ‘{ print $0}‘  a.txt
  976  awk  ‘FNR==5{ print $0}‘  a.txt
  977  awk  ‘NR==5{ print $0}‘  a.txt
  978  awk  ‘1==5{ print $0}‘  a.txt
  979  awk  ‘1==1{ print $0}‘  a.txt
  981  awk  ‘FNR<=3{print $0}‘  a.txt
  982  awk  ‘FNR==3{print $0}‘  a.txt
  983  awk  ‘FNR!=5{print $0}‘  a.txt

awk  -F ":"  ‘$3==500{print $1,$3}‘  /etc/passwd

字符串比较
“str1”  符号   “str2”
==  等于    != 不等于

awk  -F ":"  ‘$1=="rsync"{print $1}‘  /etc/passwd
987  awk  -F ":"  ‘$1=="root"{print $1}‘  /etc/passwd
988  awk  -F ":"  ‘$1!="root"{print $1}‘  /etc/passwd

--------------------------------------------------------------------
正则表达式
值   符号    /正则表达式/
      
匹配    ~
不匹配  !~

awk     ‘$0~/r/{print  $0}‘  /etc/passwd
awk -F ":" ‘$1~/^...$/{print  $1}‘  /etc/passwd
awk -F ":" ‘$1!~/^...$/{print  $1}‘  /etc/passwd
------------------------------------------------------------------
逻辑比较 (多个条件)
逻辑与  &&  多个条件同时成立
逻辑或  ||      多个条件有一个条件成立就可以
逻辑非  !      取反

plj   bob   sync

awk  -F ":" ‘$1=="plj"  ||  $1=="bob" ||  $1=="sync"{print $1}‘  /etc/passwd

awk   -F ":"  ‘$1=="rsync"   &&  $3<500 {print $1,$3}‘ /etc/passwd

---------------------------------------------------------------------

运算符
+   -   *   /   %
++
--
+=   -=  *=  /=

输出文件中的偶数行
awk   ‘FNR%2==0{print FNR,$0}‘ a.txt

awk -F ":"  ‘$3<500{i++}  $3>=500{y++}END{print i,y}‘  /etc/passwd

head -1 /etc/passwd  | awk  ‘{i+=3}END{print i}‘
head -3 /etc/passwd  | awk  ‘{i+=3}END{print i}‘
---------------------------------------------------------------------
统计文本的列的总个数
reg.txt
aaa   ff    ccc    3
aaa   ff    ccc   www   4
aaa   ff    ccc   xxx   yyy     ccccc    6
:wq

awk  ‘BEGIN{i=0} {i+=NF} END{print i}‘  reg.txt
---------------------------------------------------------------------
seq  200 | awk  ‘BEGIN{i=0} $0%3==0 &&
 $0%13==0{print  $0;i++} END{print i}‘
--------------------------------------------------------------------
awk流程控制
if 分支结构
单分支  if  (条件表达式){条件成立时执行的命令}
  146  awk -F ":" ‘{ if($3==0)print $0  }‘  /etc/passwd
  147  awk -F ":" ‘{ if($3==0)print $0;print FNR  }‘  /etc/passwd
  148  awk -F ":" ‘{ if($3==0){print $0;print FNR}  }‘  /etc/passwd
  149  awk -F ":" ‘{ if($3==0){print $0,FNR}  }‘  /etc/passwd
  150  awk -F ":" ‘{ if($3==0){print FNR,$0}  }‘  /etc/passwd

awk   -F ":"  ‘$3==0{print $0,FNR}‘  /etc/passwd

双分支   if  (条件表达式){条件成立时执行的命令}else{}

awk -F ":" ‘{ if($3==0){print FNR,$0}else{print  $1,$6}  }‘  /etc/passwd

多分支 
if(条件1){编辑指令1}else  if(条件){编辑指令2}.. ..
    else{编辑指令N}

awk  -F ":" ‘{  if($3==0){print $1"  is admin user"}else  if($3>=1&&$3<500){print  $1,$3" inside user"  }else{print  $1,$3"  outside user"}  }‘   /etc/passwd

---------------------------------------------------------------------
循环结构  while   do..while    for

while(条件) { 循环体 }

awk  ‘BEGIN{    i=1;while( i<=3 ){print  i;i++}   }‘

awk  ‘{    i=1;while( i<=3 ){print  i;i++}    }‘   a.txt

awk  ‘{    i=1;while( i<=3 ){print  $0;i++}    }‘   a.txt

awk  -F ":"
 ‘{  i=1 ;while(i<=NF){ 
if($i~/root/){j++}; i++ }  }  END{print j}‘ 
/etc/passwd
-------------------------------------------------------------------
do{  循环体  }while(条件)   先执行循环体后判断条件

awk   ‘BEGIN{   do{ print i;i++}while(i<=3) }‘

[[email protected] ~]# awk   ‘BEGIN{   do{ i++;print i}while(i>=3)       }‘
1
[[email protected] ~]# awk ‘BEGIN{while(i>=3){i++;print i}}‘
[[email protected] ~]#

----------------------------------------------------------------------
for循环
for(初值;条件;步长){循环体}
awk  ‘BEGIN{   for (i=1;i<=5;i++){print i}   }‘

----------------------------------------------------------------------
循环结构控制语句
break          结束自己所在循环结构的执行
continue     结束自己所在循环结构的本次循环,并开始下一次循环

awk  ‘BEGIN{   for (i=1;i<=5;i++){print   i;break}   }‘

195  awk  ‘BEGIN{   for (i=1;i<=5;i++){print i;break}}‘
  196  awk  ‘BEGIN{   for (i=1;i<=5;i++){break;print i}}‘
  197  awk  ‘BEGIN{   for (i=1;i<=5;i++){  if(i==3){break};print i}}‘
  198  awk  ‘BEGIN{   for (i=1;i<=5;i++){  if(i==3){countinu};print i}}‘
  199  awk  ‘BEGIN{   for (i=1;i<=5;i++){  if(i==3){continue};print i}}‘

控制awk对文件行的处理
next 跳过当前行,读入下一行文本开始处理
exit 结束文本读入,转入END{}执行
                
如果没有END{}则直接退出awk处理操作

1003  head /etc/passwd > a.txt
 1004  awk  ‘{exit}‘ a.txt
 1005  awk  ‘FNR==3{exit}{print FNR,$0}‘ a.txt
 1006  awk  ‘FNR==3{next}{print FNR,$0}‘ a.txt
 1007  awk  ‘{next}{print FNR,$0}‘ a.txt
 1008  awk  ‘{print FNR,$0}{next}‘ a.txt

--------------------------------------------------------------
[[email protected] ~]# cat c.txt
eth0      Link encap:Ethernet  HWaddr 00:0C:29:B6:48:A6 
encap:Ethernet  HWaddr 00:0C:29:B6:48:A6 
[[email protected] ~]#
awk      ‘NF<2{next}   {print  $0 }‘ c.txt

----------------------------------------------------------------
awk 数组
定义数组
数组名[下标]=值
数组名["下标"]=值
数组名[下标]="值"

awk  ‘BEGIN{ip[1]="192.168.1.1";ip[2]=101;ip["age"]=29}‘

调用数组元素
数组名[下标]

输出数组元素
print   数组名[下标]

awk  ‘BEGIN{ip[1]="192.168.1.1";ip[2]=101;ip["age"]=29;print  ip["age"],ip[2],ip[1]}‘

awk  ‘BEGIN{  for (i=1;i<=5;i++){ip[i]="172.16.0."i} ; for (x=1;x<=5;x++){print ip[x]  }  }‘

-------------------------------------------------------------------

awk   ‘BEGIN{  stugrp["s1"]="tom"; stugrp["s2"]="lucy";stugrp["s3"]="bob"; print stugrp["s3"]}‘

遍历数组元素的循环结构
for ( 变量   in   数组名) { 循环体 }

awk   ‘BEGIN{  stugrp["s1"]="tom"; stugrp["s2"]="lucy";stugrp["s3"]="bob"; stugrp["s4"]="jerry";  for (  plj   in  stugrp) { print   plj ,stugrp[plj]}              }‘

head -3 /etc/passwd  | awk -F ":" ‘{  usergrp[$3]=$1 }END{  for ( x  in  usergrp) { print  x ,usergrp[x] }    }‘

编写脚本getupwd-awk.sh,实现以下需求:

1)找到使用bash作登录Shell的本地用户
2)列出这些用户的shadow密码记录

3)按每行“用户名 --> 密码记录”保存到getupwd.log

统计a.txt 文件中  每个用户名出现的次数
[[email protected] ~]# cat a.txt
root
bin
daemon
root
bin
lucy
lucy
lucy
daemon
root
bin
daemon
root
bin
daemon
[[email protected] ~]#
---------------------------------------------------------------------
shell基础 ( bash特性  流程控制  变量  流控函数 执行脚本)
                     expect    awk   sed    grep     数组  函数   变量替换

时间: 2024-12-19 00:48:58

shell-awk高级应用的相关文章

linux shell awk 语法

引用:http://blog.csdn.net/weekly123/article/details/1465675 inux shell awk 语法   Awk 是一种非常好的语言,同时有一个非常奇怪的名称.在本系列(共三篇文章)的第一篇文章中,Daniel Robbins 将使您迅速掌握 awk 编程技巧.随着本系列的进展,将讨论更高级的主题,最后将演示一个真正的高级 awk 演示程序.捍卫 awk在本系列文章中,我将使您成为精通 awk 的编码人员.我承认,awk 并没有一个非常好听且又非

使用shell+awk完成Hive查询结果格式化输出

好久不写,一方面是工作原因,有些东西没发直接发,另外的也是习惯给丢了,内因所致.今天是个好日子,走起! btw,实际上这种格式化输出应该不只限于某一种需求,差不多是通用的. 需求: --基本的:当前Hive查询结果存在数据与表头无法对其的情况,不便于监控人员直接查看,或者导出到excel中,需要提供一个脚本,将查询结果处理下,便于后续的查看或者操作. --额外的:A.每次查询出来的结果字段数.字段长度不固定:B.每个数据文件中可能包含不只一套查询结果,即存在多个schema. 想法: 对于基本需

2.3.1.shell awk 入门

awk:好用的数据处理工具 awk 也是一个非常棒的数据处理工具!sed 常常用于一整个行的处理, awk 则比较倾向于一行当中分成数个『栏位』(或者称为一个域,也就是一列)来处理.因此,awk 相当的适合处理小型的数据数据处理呢!awk 通常运行的模式是这样的: [[email protected] ~]# awk '条件类型1{动作1} 条件类型2{动作2} ...' filename awk 后面接两个单引号并加上大括号 {} 来配置想要对数据进行的处理动作. awk 可以处理后续接的文件

awk高级应用

IF条件判断 语法一 if (表达式) 动作1 else 动作2 语法二 if (表达式) 动作1;else 动作2 #判断boot分区可用容量小于20MB时报警,否则显示OK df |grep 'boot' |awk '{if($4<20000) print "Alart";else print "OK"}' while循环 语法一 while (条件) 动作 例子: x=1 while (i<10){ print $1 } 例子: awk 'i=1{

shell awk 的一些用法

#1.打印挂载目录的使用量,默认以空格为分割 df -Ph | awk '{ print $5,$6 }' #2.以空格.冒号.\t.分号为分割 awk -F '[ :\t;]' '{print $1}' #3.打印6.txt文件中的第3行至第5行,NR表示打印行,$0表示文本所有域 awk 'NR==3,NR==5 {print}' 6.txt awk 'NR==3,NR==5 {print $0}' 6.txt #打印6.txt文件中的第3行至第5行的第2列与第4列 awk 'NR==3,N

Linux Shell之三 高级变量及字符串

高级变量包含三个部分1.变量扩展2.命令替换3.算术扩展在Bash Shell中,$算符会触发到上述三种扩展,基本形式如下:    基本型             扩展种类            例子            ${变量名称}            变量扩展        ${filename}$(命令)                命令替换        $(ls /)$((算术式))            算术扩展        $((5+3))变量存在表示变量有值(包含空)一

转 shell awk 使用详解

awk简介 awk: 中文意思是报告生成器 能够根据我们输入的信息,将信息格式化以后显示,将定义好的信息以比较美观(直观)的方式显示出来出现比较早,继而出现了new awk(nawk)在windows上实现,gawk, awk实现在linux上.awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具.它在命令行中使用,但更多是作为脚本

shell awk入门

本文参考自 http://www.cnblogs.com/zhuyp1015/archive/2012/07/11/2586985.html awk:好用的数据处理工具 awk 也是一个非常棒的数据处理工具!sed 常常用于一整个行的处理, awk 则比较倾向于一行当中分成数个『栏位』(或者称为一个域,也就是一列)来处理.因此,awk 相当的适合处理小型的数据数据处理呢!awk 通常运行的模式是这样的: [[email protected] ~]# awk '条件类型1{动作1}  条件类型2{

[转]shell awk sed tr grep 语法汇总

tr 基本语法 -c          # 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII  -d          # 删除字符串1中所有输入字符  -s          # 删除所有重复出现字符序列,只保留第一个:即将重复出现字符串压缩为一个字符串  [a-z]       # a-z内的字符组成的字符串  [A-Z]       # A-Z内的字符组成的字符串  [0-9]       # 数字串  \octal      # 一个三位的八进制数,对应有效的ASCII字符 

[CentOS 7系列]grep/sed/awk高级扩展

在上一帖的实战中,我们用到了grep的"-Po"的用法.首先,我们来看看这几个参数的含义:       -P, --perl-regexp               Interpret  PATTERN as a Perl regular expression.  This is highly               experimental and grep -P may warn of unimplemented features.              -o, --on