zoukankan      html  css  js  c++  java
  • awk--基本操作

    二:awk--将一行分为数个字段处理

    PS:awk [option] '条件类型 {动作1} 条件类型{动作2} ...' filename

    PS: awk ‘Pattern {action}’ filename

    option 条件类型Pattern 动作
    -F: 默认为空格
    awk -F ':' '{print $3}' passwd
    正则表达式或逻辑判断式 内置函数:print(),printf(),getline..
    控制指令:if(){...}else{...};while(){...}等等

    awk工作原理:

    1:awk读取一条记录作为(文件中的一行)作为输入,并将这条记录赋值给内部变量$0
    2:记录被分隔为多个字段,每一个字段都被存储到指定编号的变量中,从$1开始
    3:对于每一条记录,按照给定的Pattern匹配,匹配成功则执行对应的Action,如匹配失败,则不执行Action
    #Pattern和Action必须提供其中的一个,如果Action为{},则表示不做任何动作
    4:重复上面的1-3步骤,直到文件结束
    

    一:基本使用


    1:awk处理文本是以一行为单位,它会遍历记录
    [root@localhost tmp]# awk '{print $0}'  passwd     #$0代表一条记录,注意要用----单引号
    
    2:输出指定列(字段)
    [root@localhost tmp]# cat test.txt 
    aaa bbb ccc ddd
    eee fff hhh iii
    jjj kkk lll mmm
    nnn ooo ppp qqq
    [root@localhost tmp]# awk '{print $1,$3}' test.txt  #默认分隔符就是空格
    aaa ccc
    eee hhh
    jjj lll
    nnn ppp
    
    
    3:修斯一下表头和表尾
    [root@localhost tmp]# awk -F ':' 'BEGIN{print "Line Col User "} {print NR,NF,$1}END{print "--------"FILENAME"--------"}' passwd 
    Line Col User 
    1 7 root
    2 7 bin
    3 7 daemon
    4 7 adm
    5 7 lp
    6 7 sync
    7 7 shutdown
    --------passwd--------
    
    
    [root@localhost tmp]# awk -F ':'  'BEGIN{print "User-UID-GID "} {print $1,$3,$4} END {print " "}' passwd  
    User-UID-GID 
    root 0 0
    bin 1 1
    daemon 2 2
    adm 3 4
    lp 4 7
    sync 5 0
    shutdown 6 0
    ##注意:print的字符串要用双引号括起来,不要忘记写被处理的文件
    ##BEGIN和END都不参与循环过程
    ##:BEGIN:表示在awk对文件处理之前---首先被执行
    ##:END:表示在awk对所有文件行处理完之后--才被执行
    
    
    4:巧妙的显示奇数行/偶数行
    [root@localhost tmp]# awk 'NR%2==0{next}  {print NR,$0}' passwd 
    1 root:x:0:0:root:/root:/bin/bash
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    ...
    ##:NR内部变量,代表当前处理的行数;next:忽略后面指定的动作,直接进入下一行进行处理
    
    
    [root@localhost tmp]# awk 'NR%2==1 {next}{print NR,$0}' passwd   #输出偶数行
    
    
    5:固定行数并合并
    [root@localhost tmp]# cat -n input 
         1  one
         2  two
         3  three
         4  four
         5  five
         6  six
         7  seven
         8  eight
         9  nine
        10  ten
       
    [root@localhost tmp]# awk 'NR%3!=0{T=(T " " $0);next}   {print T, $0;T=""}' input 
     one two three
     four five six
     seven eight nine
     ###
    ● 首先,上面式子由两部分组成:
    ◇ 第一部分:NR%3!=0{T=(T""$0);next}。
    ◇ 第二部分:{print T,$0;T=""}。
    ● 第一部分,表示当NR(文件的当前的行号)不是3的倍数时,先执行{T=(T""$0);next},然后执行第二部分的内容。当NR是3的倍数时,直接执行第二部分的内容。
    ● 语句{T=(T""$0);next}中的T=(T""$0)表示将字符型变量T、空格和变量$0三者的值进行连接,然后再赋值给变量T。也就是说,awk语句每读取一行都把这行的内容追加到变量T中。
    ● 而next的作用很关键,它表示不再执行第二部分的语句,而是直接进行下一行的处理,这样就能保证awk把每3行一组的内容都存储到变量T中。
    ● 第二部分{print T,$0;T=""}表示输出变量T和$0的内容,并且把变量T的内容清空。
    ● 通过第一部分和第二部分的语句,可以实现3行一组的前两行内容会存放到变量T中,当处理到第三行时,就会把所有之前存储的内容都输出出来,然后就会清空变量T,再进行下一组数据的处理。
    
    [root@localhost tmp]# awk 'NR%3!=0{T=(T " " $0);next}   {print T, $0;T=""} END{print " "$0} ' input 
    ###输出最后一行
    
    
    5:不定行数合并----用到正则表达式
    [root@localhost tmp]# cat -n input2.txt 
         1  xiaoming worktime is 
         2  89 
         3  88
         4  87
         5  86
         6
         7  xiaoqiang worktime is
         8  77
         9  78
        10  79
        11  80
        12
        13  xiaohong worktime is
        14  69
        15  68
        16  66
    [root@localhost tmp]# awk 'BEGIN{print T=""}    /worktime/{print T;T=$0;next}  {T=T " " $0}   END{print T}' input2.txt               
    
    
    xiaoming worktime is  89  88 87 86 
    xiaoqiang worktime is 77 78 79 80 
    xiaohong worktime is 69 68 66
    
    ###分为4个部分:1:BEGIN{print T=""}:开始awk处理每行记录是,先执行的action
    			  2: /worktime/  模式匹配,匹配成功则执行{print T;T=$0;next}
    			  3:						 匹配不成功则执行{T=T " " $0}
    			  4:END{print T}:awk处理完之后,最后执行的。
    
    6:合并所有的行
    [root@localhost tmp]# awk '{T=T " " $0}END{print T}' input.txt
     one two three four five six seven eight nine ten
    
    

    二:内置变量

    name description
    NR 每行的记录号---行号
    NF 字段数量的变量--字段总数,列好
    FILENAME 正在处理的文件名
    1:打印内置变量
    [root@localhost tmp]# awk -F ':' '{print NR,NF,FILENAME}'  passwd 
    1 7 passwd
    2 7 passwd
    3 7 passwd
    4 7 passwd
    5 7 passwd
    6 7 passwd
    7 7 passwd
    2:打印行号,列数和用户名
    [root@localhost tmp]# awk -F ':' '{print "Line: "NR,"Col: "NF,"User:" $1}' passwd 
    Line: 1 Col: 7 User:root
    Line: 2 Col: 7 User:bin
    Line: 3 Col: 7 User:daemon
    Line: 4 Col: 7 User:adm
    Line: 5 Col: 7 User:lp
    Line: 6 Col: 7 User:sync
    Line: 7 Col: 7 User:shutdown
    [root@localhost tmp]# awk -F ':' '{printf("Line: %s,Col: %s,User: %s
    ",NR,NF,$1)}' passwd   #方法二
    
    3:显示passwd种用户ID大于100的行号和用户名
    [root@localhost tmp]# awk -F ':'  '{if($3>100){printf("Line: %s,Col: %s,User: %s
    ",NR,NF,$1)}}' passwd 
    Line: 15,Col: 7,User: polkitd
    Line: 17,Col: 7,User: avahi-autoipd
    Line: 20,Col: 7,User: oracle
    
    
    

    三:逻辑判断式

    name description
    ,! 匹配正则表达式
    ==,!=,<,> 判断逻辑表达式
    1:~使用,匹配以o开头用户id
    [root@localhost tmp]# awk -F ':' '$1~/^o.*/{print $1}'  passwd 
    operator
    oracle
    2:判断用户id大于100的用户
    [root@localhost tmp]# awk -F ':' '$3>100{print $1}'  passwd         
    polkitd
    avahi-autoipd
    oracle
    [root@localhost tmp]#
    
    

    四:案列

    1:统计当前文件夹下的文件和文件夹的大小
    1:[root@localhost usr]# du -sh * | sort -h   ###文件实际占用的空间
    2:[root@localhost usr]# ls -l | awk 'BEGIN{size=0}{size+=$5}END{print size/1024/1024 "M"} '
    ###du == disk usage (磁盘使用量,占用的磁盘空间)
    ###一个文件占用的磁盘空间和一个文件的大小是两码事情
    ###通常情况下,ls 显示的文件大小比du显示的磁盘占用空间小,比如文件系统的block是4K,一个13K的文件占用的空间是 13k/4k = 3.25 个block,一个block只能被一个文件占用,因此实际占用空间就是4个block,就是16K
    
    2:统计当前passwd中的用户人数
    [root@localhost tmp]#  awk -F ':'  'BEGIN{count=0}  $1!~/^$/{count++}   END{print "count = " count}' passwd 
    count = 20
    3:统计UID大于100的用户的UID
    [root@localhost tmp]#  awk -F ':'  'BEGIN{count=0}  $3>100{count++;print $1}   END{print "count = " count}' passwd 
    polkitd
    avahi-autoipd
    oracle
    count = 3
    ###动作可以用;分开
    
    方法2:
    [root@localhost tmp]#  awk -F ':'  'BEGIN{count=0}  {if($3>100){name[count++]=$1}}   END{for(i=0;i<count;i++)print i,name[i]}' passwd        
    0 polkitd
    1 avahi-autoipd
    2 oracle
    
    4:杀死11005端口的所有进程
    [root@localhost tmp]# ps -ef | grep 11005 | grep -v grep | awk '{print "kill -9 " $2  }' | sh
    
    
  • 相关阅读:
    hdu 1028 Ignatius and the Princess III
    程序猿编程之路
    编程心得
    HDU 1106 排序
    水利水电工程施工导截流方案辅助设计系统成功进行国家计算机软件著作权登记!
    调洪演算双辅助线法计算程序(带石门坎水电站算例)
    水利水电工程施工导截流方案辅助设计系统DivClose——关键技术
    水利水电工程施工导截流方案辅助设计系统DivClose的图形用户界面
    水利水电工程施工导截流方案辅助设计系统DivClose软件特色
    施工导截流方案设计软件现状
  • 原文地址:https://www.cnblogs.com/zhoujun007/p/awk.html
Copyright © 2011-2022 走看看