文本三剑客之awk命令

awk命令详解:
可以实现下面功能:
文本处理
输出格式化的文本报表
执行算术运算
执行字符串操作

格式:
awk [options] 'program' var=value file...
awk [options] -f programfile var=value file...

说明:
program通常是放在单引号中,并可以由三种部分组成
BEGIN语句块
模式匹配的通用语句块
END语句块

常见选项:
    -F ”分隔符“指明输入时用到的字段分隔符
    -v var=value 变量赋值

    Program格式:
        pattern{action statements;...}

    pattern:决定动作语句何时触发及触发事件,比如:BEGIN,END
    action statements:对数据进行处理,放在{}内指明,常见:print,printf

动作 print
格式:
print item1,item2,...
说明:
逗号分隔符
输出item可以是字符串,也可以是数值;当前记录的字段、变量或awk的表达式
如省略item,相当于print $0

范例:
[root@centos8 ~]#awk    '{print "hello,awk"}' 
[root@centos8 ~]#awk -F: '{print "wang"}' /etc/passwd
[root@centos8 ~]#awk -F: '{print}' /etc/passwd 
[root@centos8 ~]#awk -F: '{print $0}' /etc/passwd
[root@centos8 ~]#awk -F: '{print $1,$3}' /etc/passwd
[root@centos8 ~]#awk -F: '{print $1"\t"$3}' /etc/passwd
[root@centos8 ~]#grep "^UUID" /etc/fstab |awk {'print $2,$3'} / xfs

awk变量:
    分为内置变量和自定义变量
常见的内置变量:FS、OFS、RS、ORS、NF、NR、FNR、FILENAME、ARGC、ARGV

FS:输入字段分隔符,默认为空白字符,功能相当于-F
范例:
    awk -v FS=':'  '{print $1,FS,$3}' /etc/passwd 
    awk -v FS=":" '{print $1FS$3}' /etc/passwd 
    awk –F:   '{print $1,$3,$7}'   /etc/passwd  
    S=:;awk -v FS=$S '{print $1FS$3}' /etc/passwd

OFS:输出字段分隔符,默认为空白字符
范例:
    awk  -v FS=':'  -v OFS=':'  '{print $1,$3,$7}'   /etc/passwd

RS:输入记录分隔符,指定输入时的换行符
范例:
    awk -v RS=' ' ‘{print }’ /etc/passwd

    ORS:输出记录分隔符,输出时用指定符号代替换行符
    范例:
        awk -v RS=' ' -v ORS='###' '{print $0}' /etc/passwd

    NF:字段数量
    范例:
        #引用变量时,变量前不需加$ 
        [root@centos8 ~]#awk  -F:'{print NF}'   /etc/fstab
        [root@centos8 ~]#awk  -F:'{print $(NF-1)}'  /etc/passwd
        [root@centos8 ~]#ls /misc/cd/BaseOS/Packages/*.rpm |awk -F"." '{print $(NF1)}'|sort |uniq -c    3
        89 i686    
        208 noarch   
        1060 x86_64 
        [root@centos8 ~]#ss -nt |grep "^ESTAB" | awk -F"[[:space:]]+|:" '{print $(NF2)}' 
        10.0.0.1 
        10.0.0.7 
        10.0.0.1 
        [root@centos8 ~]#ss -nt |awk -F"[[:space:]]+|:" '/^ESTAB/{print $(NF-2)}'

NR:记录编号
范例:
    [root@centos8 ~]#awk -F: '{print NR}' /etc/passwd 
    1 
    2 
    3 
    ....... 
    [root@centos8 ~]#awk -F: 'END{print NR}' /etc/passwd 
    57
    [root@centos8 ~]#awk -F: 'BEGIN{print NR}' /etc/passwd 
    0

FNR:各文件分别计数,记录号
    范例:
        awk '{print FNR}'  /etc/fstab /etc/inittab
        [root@centos8 ~]#awk  '{print NR,$0}' /etc/issue /etc/redhat-release 
        1 \S 
        2 Kernel \r on an \m 
        3 
        4 CentOS Linux release 8.0.1905 (Core) 
        [root@centos8 script40]#awk  '{print FNR,$0}' /etc/issue /etc/redhat-release 
        1 \S 
        2 Kernel \r on an \m 
        3 
        1 CentOS Linux release 8.0.1905 (Core)
        [14:56:21 root@centos8 ~]# awk '{print NR}' /etc/issue /etc/redhat-release 

1
2
3
4
[15:15:22 root@centos8 ~]# awk '{print FNR}' /etc/issue /etc/redhat-release
1
2
3
1

FILENAME:当前文件名
范例:
    [15:18:41 root@centos8 ~]# awk '{print FNR,FILENAME,$0}' /etc/issue /etc/redhat-release 

1 /etc/issue \S
2 /etc/issue Kernel \r on an \m
3 /etc/issue
1 /etc/redhat-release CentOS Linux release 8.0.1905 (Core)

ARGC:命令行参数的个数
范例:
    [15:25:14 root@centos8 ~]# awk '{print ARGC}' /etc/issue /etc/redhat-release 

3
3
3
3
[15:25:29 root@centos8 ~]# awk 'BEGIN{print ARGC}' /etc/issue /etc/redhat-release
3

ARGV:数组,保存的是命令行所给定的各参数
范例:
    [15:25:34 root@centos8 ~]# awk 'BEGIN{print ARGV[0]}' /etc/issue /etc/redhat-release 

awk
[15:29:58 root@centos8 ~]# awk 'BEGIN{print ARGV[1]}' /etc/issue /etc/redhat-release
/etc/issue
[15:30:31 root@centos8 ~]# awk 'BEGIN{print ARGV[2]}' /etc/issue /etc/redhat-release
/etc/redhat-release
[15:30:40 root@centos8 ~]# awk 'BEGIN{print ARGV[3]}' /etc/issue /etc/redhat-release

动作 printf:
    printf可以实现格式化输出:
        格式:
            printf "FORMAT" , item1 , item2, ...
        说明:
            必须指定FORMAT
            不会自动换行,需要显示给出换行控制符,\n
            FORMAT中需要分别为后面每个item指定格式符
        格式符:与item——对应
            %c:显示字符的ASCII码
            %d,%i:显示十进制整数
            %e,%E:显示科学计数法数值
            %f:显示为浮点数
            %g,%G:以科学计数法或浮点形式显示数值
            %s:显示字符串
            %u:无符号整数
            %%:显示%自身

        修饰符:
            #[.#]  第一个数字控制显示的宽度;第二个#表示小数点后精度,如:%3.1f
            -   左对齐(默认为右对齐) 如:%-15s
            +  显示数值的正负符号  如:%+d

猜你喜欢

转载自blog.51cto.com/14880320/2513353