zoukankan      html  css  js  c++  java
  • awk入门

    基本语法

    awk [options] 'Pattern{Action}' file

    ps:

    1. options :-F 和-v
    2. action   :print和printf
    3. Pattern  :两种特殊模式BEGIN和END

      Pattern实际上就是条件,默认情况下awk是逐行处理文本的,如果我们指定了条件(Pattern),只有满足了条件的行,才会被处理,不满足则不处理!!

    实例:

    [release@WEBAPP2 ~]$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    TIME_WAIT 85
    CLOSE_WAIT 8
    ESTABLISHED 150

    ps:/^tcp/(Pattern)只处理以tcp开头的行;最后处理END(特殊模式)指定的action。

    Action(常用print)

    示例1:

    [release@log-backup ~]$ df -h
    Filesystem                   Size  Used Avail Use% Mounted on
    /dev/sda3                    288G   70G  204G  26% /
    tmpfs                         16G     0   16G   0% /dev/shm
    /dev/sda1                    194M   34M  150M  19% /boot
    /dev/mapper/LogStorage-lv01   16T  6.0T  9.1T  40% /logstorage
    [release@log-backup ~]$ df -h |awk '{print $5}' 
    Use%
    26%
    0%
    19%
    40%
    You have mail in /var/spool/mail/release

    ps:

    1. 此示例没有使用到options和pattern,awk '{print $5}'表示df -h 输出的第5列,
    2. $5表示当前行按照分隔符分隔后的第5列,
    3. 不指定分隔符时,默认使用空格作为分隔符,且将连续的空格作为一个分隔符处理
    4. awk逐行处理数据

    示例2:输出多列,以逗号隔开

    [release@log-backup ~]$ df -h |awk '{print $2,$5}'
    Size Use%
    288G 26%
    16G 0%
    194M 19%
    16T 40%
    You have mail in /var/spool/mail/release

    示例3:添加自定义字段

    [release@log-backup ~]$ df -h |awk '{print "总空间:",$2,"已使用:",$5}'
    总空间: Size 已使用: Use%
    总空间: 288G 已使用: 26%
    总空间: 16G 已使用: 0%
    总空间: 194M 已使用: 19%
    总空间: 16T 已使用: 40%
    You have mail in /var/spool/mail/release

    Pattern(两种特殊模式BEGIN和END)

    示例1:BEGIN处理文本前,先执行

    [root@localhost ~]# awk 'BEGIN{print "begin"}'
    begin

    示例2:

    [release@PSC ~]$ df -h
    文件系统              容量  已用 可用 已用% 挂载点
    /dev/sda3              48G   40G  5.1G  89% /
    /dev/sda1             198M   13M  176M   7% /boot
    tmpfs                 1.5G     0  1.5G   0% /dev/shm
    [release@PSC ~]$ df -h |awk 'BEGIN{print "BEGIN first done"}{print $2,$5}'
    BEGIN first done
    容量 已用%
    48G 89%
    198M 7%
    1.5G 0%

    ps:红色字体即为处理文本前,执行的BEGIN指定的Action.

    示例3:END文本处理完后,最后执行指定的Action

    [release@PSC ~]$ df -h |awk 'END{print "END  done ......"}{print $2,$5}'                 
    容量 已用%
    48G 89%
    198M 7%
    1.5G 0%
    END  done ......

    awk的变量

    内置变量

    属性

    说明

    $0

    当前记录(作为单个变量)

    $1~$n

    当前记录的第n个字段,字段间由FS分隔

    FS

    输入字段分隔符 默认是空格

    NF

    当前记录中的字段个数,就是有多少列

    NR

    已经读出的记录数,就是行号,从1开始

    RS

    输入的记录他隔符默 认为换行符

    OFS

    输出字段分隔符 默认也是空格

    ORS

    输出的记录分隔符,默认为换行符

    ARGC

    命令行参数个数

    ARGV

    命令行参数数组

    FILENAME

    当前输入文件的名字

    IGNORECASE

    如果为真,则进行忽略大小写的匹配

    ARGIND

    当前被处理文件的ARGV标志符

    CONVFMT

    数字转换格式 %.6g

    ENVIRON

    UNIX环境变量

    ERRNO

    UNIX系统错误消息

    FIELDWIDTHS

    输入字段宽度的空白分隔字符串

    FNR

    当前记录数

    OFMT

    数字的输出格式 %.6g

    RSTART

    被匹配函数匹配的字符串首

    RLENGTH

    被匹配函数匹配的字符串长度

    SUBSEP

    数组分隔符。将(I,J)转换为 I SUBSEP J, 模拟多维数组用

    示例1:

    [release@PSC ~]$ cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    [release@PSC ~]$ awk -F: '{print $1,$NF}' /etc/passwd
    root /bin/bash
    bin /sbin/nologin
    daemon /sbin/nologin
    [release@PSC ~]$ awk -v FS=':' '{print $1,$NF}' /etc/passwd   
    root /bin/bash
    bin /sbin/nologin
    daemon /sbin/nologin

    ps:

    1. -F和-v为options
    2. -F:和-v FS=":"指定输入分隔符为:
    3. $NF为最后一列

    示例2:指定FS和OFS

    [release@PSC ~]$ awk -v FS=':' -v OFS='----->' '{print $1,$NF}' /etc/passwd
    root----->/bin/bash
    bin----->/sbin/nologin
    daemon----->/sbin/nologin

    示例3:(NR,NF)

    [release@PSC ~]$ cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    [release@PSC ~]$ awk -v FS=':' '{print NR,NF}' /etc/passwd                     
    1 7
    2 7
    3 7

    示例4:(FNR)

    [release@PSC test]$ awk '{print $0}' test
    t:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    [release@PSC test]$ awk '{print $0}' test2
    abayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
    release:x:500:500::/home/release:/bin/bash
    zabbix:x:501:501::/home/zabbix:/sbin/nologin
    [release@PSC test]$ awk '{print NR,$0}' test test2
    1 t:x:0:0:root:/root:/bin/bash
    2 bin:x:1:1:bin:/bin:/sbin/nologin
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4 abayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
    5 release:x:500:500::/home/release:/bin/bash
    6 zabbix:x:501:501::/home/zabbix:/sbin/nologin
    [release@PSC test]$ awk '{print FNR,$0}' test test2
    1 t:x:0:0:root:/root:/bin/bash
    2 bin:x:1:1:bin:/bin:/sbin/nologin
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    1 abayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
    2 release:x:500:500::/home/release:/bin/bash
    3 zabbix:x:501:501::/home/zabbix:/sbin/nologin
    FNR

    示例5:(RS)

    [release@PSC test]$ awk -v RS=':' '{print NR,$0}' test  
    1 root
    2 x
    3 0
    4 0
    5 root
    6 /root
    7 /bin/bash
    bin
    8 x
    9 1
    10 1
    11 bin
    12 /bin
    13 /sbin/nologin
    daemon
    14 x
    15 2
    16 2
    17 daemon
    18 /sbin
    19 /sbin/nologin
    RS

    示例6:(ORS)

    [release@PSC test]$ awk -v ORS='===' '{print NR,$0}' test  
    1 root:x:0:0:root:/root:/bin/bash===2 bin:x:1:1:bin:/bin:/sbin/nologin===3 daemon:x:2:2:daemon:/sbin:/sbin/nologin===[release@PSC test]$ 

    示例7:(RS和ORS)

    [release@PSC test]$ awk -v RS=':' -v ORS='==' '{print NR,$0}' test
    1 root==2 x==3 0==4 0==5 root==6 /root==7 /bin/bash
    bin==8 x==9 1==10 1==11 bin==12 /bin==13 /sbin/nologin
    daemon==14 x==15 2==16 2==17 daemon==18 /sbin==19 /sbin/nologin
    ==[release@PSC test]$ 

    示例8:(ARGV,ARGC)

    [release@PSC test]$ awk 'BEGIN{print "Begin..."}' test test2  
    Begin...
    [release@PSC test]$ awk 'BEGIN{print "Begin...",ARGV[1]}' test test2     
    Begin... test
    [release@PSC test]$ awk 'BEGIN{print "Begin...",ARGV[0],ARGV[1],ARGV[2],ARGC}' test test2   
    Begin... awk test test2 3

    PS:awk规定'pattern{action}'不被看做是参数,awk被看做参数.

    自定义变量

    1. -v var=value
    2. program中直接定义

    示例1:

    [release@PSC test]$ awk -v myVar="testVar" 'BEGIN{print myVar}'         
    testVar

    示例2:

    [release@PSC test]$ awk 'BEGIN{Myvar="testVar";print Myvar}'   
    testVar

     awk的格式化输出

    printf

    示例1:

    [release@PSC test]$ echo testString
    testString
    [release@PSC test]$ printf testString
    testString[release@PSC test]$ 
    [release@PSC test]$ printf 'testString
    '
    testString

    ps:printf自己定制格式

    常用格式替代符

    %d 十进制整数
    %f 浮点格式
    %o 不带正负号的八进制值
    %s 字符串
    %% 字面意义的%

    示例2:

     
    [release@PSC test]$ printf "( %s )" 1 2 43 55;echo ''
    ( 1 )( 2 )( 43 )( 55 )
    [release@PSC test]$ printf "%s
    " 1 2 43 55
    1
    2
    43
    55

    示例3:

    [release@PSC test]$ printf '%s %s
    ' 姓名 年龄 欧阳司马 12 黄埔明月 13
    姓名 年龄
    欧阳司马 12
    黄埔明月 13
    [release@PSC test]$ printf '%15s %15s
    ' 姓名 年龄 欧阳司马 12 黄埔明月 13
               姓名            年龄
           欧阳司马              12
           黄埔明月              13
    [release@PSC test]$ printf '%-15s %-15s
    ' 姓名 年龄 欧阳司马 12 黄埔明月 13
    姓名            年龄           
    欧阳司马        12             
    黄埔明月        13  

    ps:

    1. %s格式替换符
    2. 数字代表占位宽度
    3. -左对齐,+右对齐

    示例4:

    [release@PSC test]$ printf '%d
    ' 1 2 3 4 5
    1
    2
    3
    4
    5
    [release@PSC test]$ awk 'BEGIN{printf "%d
    ",1,2,3,4,5}'
    1
    [release@PSC test]$ awk 'BEGIN{printf "%d
    %d
    %d
    %d
    %d
    ",1,2,3,4,5}'
    1
    2
    3
    4
    5

    ps:

    1. 指定格式和被格式化文本之间用逗号隔开
    2. 格式中的格式替换符必须与被格式化文本一一对应。

    示例5:

    [release@PSC test]$ cat test
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    [release@PSC test]$ awk -F: 'BEGIN{printf "%s	%-15s
    ","用户名","用户bash"}{printf "%s	%-15s
    ",$1,$NF}' test
    用户名  用户bash       
    root    /bin/bash      
    bin     /sbin/nologin  
    daemon  /sbin/nologin  
  • 相关阅读:
    给a标签加样式的写法
    IE6、IE7下不支持overflowy:hidden;
    fontfamily:微软雅黑
    文字加下划线
    IE8下按钮与右边的距离比IE7和IE6的多了一倍
    在button(div)里设置背景图后,在IE6下背景图的高度被撑开了
    li中包含span,在IE6、IE7下会有3pxbug
    事件冒泡
    [LeetCode] Insert Interval 解题报告
    [LeetCode] Generate Parentheses 解题报告
  • 原文地址:https://www.cnblogs.com/chbo/p/7001741.html
Copyright © 2011-2022 走看看