awk 命令

    AWK是linux下对文本及数据进行扫描处理,数据可以来自标准输入、文件、管道。把文件中读取到的每一行的每个字段分别进行格式化,而后进行显示;支持使用变量、条件判断、循环、数组

              awk [options] 'script' FILE ...
              awk [options] '/pattern/{action}' FILE ...

AWK有两处特殊的模式:GEGIN和END,被放置在没有读取任何数据之前以及在所有数据读取完后执行

wKiom1b4ir2iCcrvAAGG62NprHs669.jpg



模式:
                  地址定界:/pat1/,/pat2/
                  /pattern/
                !/pattern/  取反匹配的

                  BEGIN:执行前的做准备工作

                  END: 执行后的收尾工作

        awk -F: 'BEGIN{print "UserName:\n------------"}$3>500{print $1}END{print "---------------"}' /etc/passwd
        awk 'BEGIN {FS=":"}$3>=500{print $1}' /etc/passwd   ### 执行前把分隔符改为冒号
                 


1、AWK的分隔符与记录字段

    (a)、分隔符:

            输入分隔符:
                行分隔符  默认是$符、字段分隔符  默认是空白。

            输出分隔符:
                行分隔符  默认是$符、字段分隔符  默认是空白。

            如果想修改默认的分隔符,可以通过-F指定,或在BEGIN重新对FS进行赋值。

    # awk 'BEGIN{FS = ":"}{print $1}'  /etc/passwd

    # awk -F : '{print $1}' /etc/passwd

    # echo 'hello world:is work' | awk -F "[:, ]" '{print $3}'  \\ 指定多个分隔符

    (b)、记录字段

    AWK以分隔符把从文件中读取一条记录,记录在$0中,分割后的多个字段分别存储在$1....$NF,字段的个数为NF

    # awk -F : '{print $1}'  /etc/passwd    \\ 输出该文件的第一个字段

    # awk -F : '{print $NF}'  /etc/passwd   \\ 输出该文件的最后一个字段

    # awk -F : '{print NF}'  /etc/passwd   \\ 输出该文件的字段的个数

    

2、awk内置变量

        ARGC:命令行参数的个数

        FILENAME:当前输入文档的名称

        FNR:输入文件的当前记录编号,当有多个文档时有用

        NR:输入流的当前记录编号

        NF:字段数,可以说最后一个字段
        FS: 读入行时使用的字段分隔符,默认为空白
        OFS: 输出时使用字段分隔符,默认为空白

        ORS:输出记录分隔符,默认为换行\n

        RS:输入记录分隔符,默认为换行\n

      

3、表达式与操作符

+

-

*

/

%

^ 幂运算

--

++

+=

-=

/=

<

>

<=

>=

==

!= 不等于

~ 匹配

!~ 不匹配

&&  与

|| 或

# awk -F : '$3>500{print $1,$3}' /etc/passwd

# awk -F : '$NF~/bash$/{print $NF}' /etc/passwd

# awk '/^$/ {x+=1} END {print x}' /etc/rc.d/init.d/functions
72


*****************高级应用**********************************

1、if条件判断

格式:

    if (表达式) 动作1; else动作2

awk  -F :   '{if ($3>500) print $1,"user";else print $1,"ADMIN"}'  /etc/passwd


2、while循环

格式1:

while (条件)
动作

# awk 'i=1 {} BEGIN { while (i<=10) {++i;print i}}'

格式2:

do 
动作
while (条件)

# awk 'BEGIN { do {++x;print x} while (x<=10)}'


3、for循环

格式:

for (变量;条件;计数器)

    动作

# awk 'BEGIN{for(i=1;i<=10;i++) print i}'


4、break与contiue

for (i=1;i<=10;i++) {
     if (i=5)
        continue     \\ 这里用contiue,当符合条件时就会跳出循环,只有=5时不会打印,换成break则只会打印4行。
    print i
}


5、函数

getline函数

    作用,从输入中读取下一行内容,从下面df -h 输出结果可以看出,有的剩余余量在第3列,有的在第4列,这样只有通过判定NF字段数来截获数据,如果遇到NF为1的可以通过getline函数跳过当前行。

[root@zibbix ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_system-root  \\ 一行
                       29G  1.9G   26G   7% /
tmpfs                 504M     0  504M   0% /dev/shm
/dev/sda1             194M   27M  158M  15% /boot
/dev/mapper/vg_system-var  \\一行
                       20G  584M   18G   4% /var

[root@zibbix ~]# df -h | awk '{if(NF==1){getline;print $3};if(NF==6)print $4}'
26G
504M
158M
18G



 练习:
        1、显示GID小于500的组;
        # awk -F : '$3<500{print $1}' /etc/group
        # awk -F : 'BEGIN{print "group name\n============="}$3<500{print $1}' /etc/group
        2、显示默认shell为nologin的用户;
        # awk -F : '$7~/nologin$/{print $1}' /etc/passwd
        3、显示eth0网卡文件的配置信息,注意,只显示等号后面的值;
        # awk -F = '{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0
        4、显示/etc/sysctl.conf文件中定义的内核参数;只显示名称;
        # awk -F = '!/^#|^$/{print $1}' /etc/sysctl.conf
        # awk -F = '/^[^#]/{print $1}' /etc/sysctl.conf
        5、显示eth0网卡的ip地址;通过ifconfig的命令结果进行过滤
        # ifconfig eth0 | awk '/inet addr/{print $2}' | awk -F: '{print $2}'

        # ifconfig eth0 | awk -F "[:, ]" '/inet addr/{print $13}'
            192.168.0.28 \\ 第二种结果的缺点是,如果空白字符有多个也算在内










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章