zoukankan      html  css  js  c++  java
  • AWK

    AWK 内置变量表

    1、常用操作

    [chengmo@localhost ~]$ awk '/^root/{print $0}' /etc/passwd 
    root:x:0:0:root:/root:/bin/bash

    /^root/ 为选择表达式,$0代表是逐行

    2、设置字段分隔符号(FS使用方法)

    [chengmo@localhost ~]$ awk 'BEGIN{FS=":"}/^root/{print $1,$NF}' /etc/passwd
    root /bin/bash

    FS为字段分隔符,可以自己设置,默认是空格,因为passwd里面是”:”分隔,所以需要修改默认分隔符。NF是字段总数,$0代表当前行记录,$1-$n是当前行,各个字段对应值。

    3、记录条数(NR,FNR使用方法)

    [chengmo@localhost ~]$ awk 'BEGIN{FS=":"}{print NR,$1,$NF}' /etc/passwd
    1 root /bin/bash
    2 bin /sbin/nologin
    3 daemon /sbin/nologin
    4 adm /sbin/nologin
    5 lp /sbin/nologin
    6 sync /bin/sync
    7 shutdown /sbin/shutdown
    ……

    NR得到当前记录所在行

    4、设置输出字段分隔符(OFS使用方法)

    [chengmo@localhost ~]$ awk 'BEGIN{FS=":";OFS="^^"}/^root/{print FNR,$1,$NF}' /etc/passwd
    1^^root^^/bin/bash

    OFS设置默认字段分隔符

    5、设置输出行记录分隔符(ORS使用方法)

    [chengmo@localhost ~]$ awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}' /etc/passwd       
    1 root /bin/bash^^2 bin /sbin/nologin^^3 daemon /sbin/nologin^^4 adm /sbin/nologin^^5 lp /sbin/nologin

    从上面看,ORS默认是换行符,这里修改为:”^^”,所有行之间用”^^”分隔了。

    6、输入参数获取(ARGC ,ARGV使用)

    [chengmo@localhost ~]$ awk 'BEGIN{FS=":";print "ARGC="ARGC;for(k in ARGV) {print k"="ARGV[k]; }}' /etc/passwd
    ARGC=2
    0=awk
    1=/etc/passwd

    ARGC得到所有输入参数个数,ARGV获得输入参数内容,是一个数组。

    7、获得传入的文件名(FILENAME使用)

    [chengmo@localhost ~]$ awk 'BEGIN{FS=":";print FILENAME}{print FILENAME}' /etc/passwd

    /etc/passwd

    FILENAME,$0-$N,NF 不能使用在BEGIN中,BEGIN中不能获得任何与文件记录操作的变量。

    8、获得linux环境变量(ENVIRON使用)

    [chengmo@localhost ~]$ awk 'BEGIN{print ENVIRON["PATH"];}' /etc/passwd    
    /usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache:/usr/lib/icecc/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/java/jdk1.5.0_17/bin:/usr/java/jdk1.5.0_17/jre/bin:/usr/local/mysql/bin:/home/web97/bin

    ENVIRON是子典型数组,可以通过对应键值获得它的值。

    9、输出数据格式设置:(OFMT使用)

    [chengmo@localhost ~]$ awk 'BEGIN{OFMT="%.3f";print 2/3,123.11111111;}' /etc/passwd   
    0.667 123.111

    OFMT默认输出格式是:%.6g 保留六位小数,这里修改OFMT会修改默认数据输出格式。

    10、按宽度指定分隔符(FIELDWIDTHS使用)

    [chengmo@localhost ~]$ echo 20100117054932 | awk 'BEGIN{FIELDWIDTHS="4 2 2 2 2 3"}{print $1"-"$2"-"$3,$4":"$5":"$6}'
    2010-01-17 05:49:32

    FIELDWIDTHS其格式为空格分隔的一串数字,用以对记录进行域的分隔,FIELDWIDTHS="4 2 2 2 2 2"就表示$1宽度是4,$2是2,$3是2  .... 。这个时候会忽略:FS分隔符。

    11、RSTART RLENGTH使用

    [chengmo@localhost ~]$ awk 'BEGIN{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
    11 11 4
    [chengmo@localhost ~]$ awk 'BEGIN{start=match("this is a test",/^[a-z]+$/); print start, RSTART, RLENGTH }'
    0 0 –1

    RSTART 被匹配正则表达式首位置,RLENGTH 匹配字符长度,没有找到为-1.

    如果只是显示/etc/passwd的账户

    #cat /etc/passwd |awk -F ':' '{print $1}'
    root
    daemon
    bin
    sys
    这种是awk+action的示例,每行都会执行action{print $1}。

    -F指定域分隔符为':'。

    如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割

    #cat /etc/passwd |awk -F ':' '{print $1" "$7}'
    root /bin/bash
    daemon /bin/sh
    bin /bin/sh
    sys /bin/sh

    awk  '{ if ( $4 > 0 || $5 > 0 || $6 > 0) print $0}' | /bin/awk -F' ' '{printf "%s %d %d %d ",$1,$4,$5,$6}' |  awk ' { t = $4; $4 = $5; $5 = t; print; } '

    awk -F"[@ /t]" '{print $2,$3}' test

    以@,空格,Tab键分割test文件的每一行,并输出第二、第三列。

    awk '$2~/^(126|yahoo)/{print $2, $3}' test

    如果改行的第二个字段以"123"或"yahoo"开始,则输出改行的第二、第三列。

    awk '$1~/[0-9][0-9]$/{print $1, $3}' test

    如果改行的最后两个字段以数字结束,则输出改行的第一、第三列。


    awk '/mail/{print $0}' test 

    输出test文件中含有"mail"字符串的行


    $awk '$2~/mail/{print $0}' test


    输出test文件中第二个字段含有"mail"字符串的行


    $awk '$2 == "gmail.com"{$1 = "ggg";print}' test

    输出test文件中第二个字段是"gmail.com"的行,并把改行第一列改为"ggg"


    awk '$2 == "gmail.com"{$1 = "ggg"}{print}' test

    输出test文件中所有行,并且如果第二个字段是"gmail.com",把改行第一列改为"ggg"


    awk '{IGNORECASE=1;if($2 ~/^[a-z]/&& $2~/net$/){print $0}}' test

    打开test文件,忽略字母大小写,如果第二字段以[a-z]开头,并以"net"结尾,则输出该行。

    1.

    awk中NF和NR的意义,其实你已经知道NF和NR的意义了,NF代表的是一个文本文件中一行(一条记录)中的字段个数,NR代表的是这个文本文件的行数(记录数)。在编程时特别是在数据处理时经常用到。建议你看看有关awk编程方面的资料,这可是一个功能非常强大的工具。

    看个例子:

    1. cal 9 2003
    2.    September 2003            # NR=1;NF=2
    3. Su Mo Tu We Th Fr Sa         # NR=2;NF=7
    4.     1  2  3  4  5  6         # NR=3;NF=6
    5. 7  8  9 10 11 12 13         # NR=4;NF=7
    6. 14 15 16 17 18 19 20         # NR=5;NF=7
    7. 21 22 23 24 25 26 27         # NR=6;NF=7
    8. 28 29 30                     # NR=7;NF=3
    复制代码


    NR是指awk正在处理的记录位于文件中的位置(行号)
    NF是指awk正在处理的记录包含几个域(字段),这于域分隔符有关,默认为空

    2.

    1.awk中$NF是什么意思?
    #pwd
    /usr/local/etc
    ~# echo $PWD | awk -F/ '{print $NF}'
    etc
    NF代表:浏览记录的域的个数
    $NF代表:最后一个Field(列)

    2.awk下面的变量NF和$NF有什么区别?
    {print NF} 也有{print $NF}
    前者是输出了域个数,后者是输出最后一个字段的内容
    如:~# echo $PWD | awk -F/ '{print $NF}'

  • 相关阅读:
    Max History CodeForces
    Buy a Ticket CodeForces
    AC日记——字符串的展开 openjudge 1.7 35
    AC日记——回文子串 openjudge 1.7 34
    AC日记——判断字符串是否为回文 openjudge 1.7 33
    AC日记——行程长度编码 openjudge 1.7 32
    AC日记——字符串P型编码 openjudge 1.7 31
    AC日记——字符环 openjudge 1.7 30
    AC日记——ISBN号码 openjudge 1.7 29
    AC日记——单词倒排 1.7 28
  • 原文地址:https://www.cnblogs.com/lelin/p/11423245.html
Copyright © 2011-2022 走看看