awk工具使用

159 阅读3分钟

 作用:按特定的条件过滤文件,以特定的格式输出文本

工作流程:

        默认按照空白分隔符分割文本内容,内部有1,1,2变量用于标识分割的第一部分,第二部分;其中$0用于代表整行内容

        支持通过-F选项指定分隔符

        逐行处理工具

目录

一、aciton操作


awk [options] 'script' file1 file2

akw [options] 'pattern{action}' file1 file2

pattern:模式/条件

action:

        print

        printf

一、aciton操作

print

printf

1.print

[root@xtyw-master01 ~]# ifconfig ens192 | sed -n '2p' |awk '{print $2}'
192.168.11.42
[root@xtyw-master01 ~]# sed -n '1p' /shell/passwd |awk -F : '{print $1,$7}'
root /bin/bash
[root@xtyw-master01 ~]# sed -n '1p' /shell/passwd |awk -F : '{print "用户名:",$1
> }'
用户名: root
[root@xtyw-master01 ~]# sed -n '1p' /shell/passwd |awk -F : '{print "用户名:",$1}'
用户名: root
[root@xtyw-master01 ~]# sed -n '1p' /shell/passwd |awk -F : '{print "用户名:",$1,"shell名称:",$7}'
用户名: root shell名称: /bin/bash

2.printf

        格式化输出内容

                printf  "内容",内容1,内容2,内容3

        格式的写法:

                占位符:

                                %s        字符串

                                %d        整数

                                %f        浮点数

          注释:      

                printf默认没有换行,如果需要换行,手动添加\n

[root@xtyw-master01 ~]# 
[root@xtyw-master01 ~]# awk 'BEGIN{printf "%s","hello"}'
hello[root@xtyw-master01 ~]# 
[root@xtyw-master01 ~]# awk 'BEGIN{printf "%d",100}'
100[root@xtyw-master01 ~]# awk 'BEGIN{printf "%d",3.1415926}'
3[root@xtyw-master01 ~]# awk 'BEGIN{printf "%d\n",3.1415926}'
3
[root@xtyw-master01 ~]# awk 'BEGIN{printf "%f",3.1415926}'
3.141593[root@xtyw-master01 ~]# 

%-10s

        10:占十个字符的宽度

        -:左对齐,默认右对齐

[root@xtyw-master01 ~]# awk 'BEGIN{printf "%10s\n","shell"}'
     shell
[root@xtyw-master01 ~]# awk 'BEGIN{printf "%-10s\n","shell"}'
shell 


[root@xtyw-master01 ~]# df -hT |grep "^/"|awk '{print "磁盘名称",$1,"挂载点",$7,"使用率",$6}'
磁盘名称 /dev/mapper/centos-root 挂载点 / 使用率 3%
磁盘名称 /dev/sda1 挂载点 /boot 使用率 30%
[root@xtyw-master01 ~]# df -hT |grep "^/"|awk '{printf "%-10s%-30s%-10s%-10s%-10s%-10s\n","磁盘名称",$1,"挂载点",$7,"使用率",$6}'
磁盘名称      /dev/mapper/centos-root       挂载点       /         使用率       3%        
磁盘名称      /dev/sda1                     挂载点       /boot     使用率       30%  

 二、变量的引用

        用户自定义变量

        内置变量

1、用户自定义变量

        1)定义变量

                1)-v选项

                                -v 变量名称=值

                 2)BEGIN{}模式中定义

                                 变量名称=值

        2)调用变量

                 变量名称

[root@xtyw-master01 ~]# awk -v name="cow" 'BEGIN{print "名称:",name}'
名称: cow
[root@xtyw-master01 ~]# awk -v name="cow" -v age=18 'BEGIN{print "名称:",name,"年龄:",age}'
名称: cow 年龄: 18
[root@xtyw-master01 ~]# awk 'BEGIN{name="sheep";print name}'
sheep

2、内置变量

        FS        

                用于定义分隔符,默认空白字符

        

[root@xtyw-master01 ~]# sed -n '1p' /shell/passwd | awk -v FS=":" '{print $1}'
root

  OFS

        用于定义akw输出多段内容的分隔符,默认空白字符

[root@xtyw-master01 ~]# sed -n '1p' /shell/passwd | awk -v FS=":" -v  OFS="-->" '{print $1,$2,$3}'
root-->x-->0

  RS

        用于定义awk读取多行内容时的行分隔符,默认换行符

[root@xtyw-master01 ~]# sed -n '1,2p' /shell/passwd |awk -v RS=":" -v OFS="-->" '{print $0}'
root
x
0
0
root
/root
/bin/bash
bin
x
1
1
bin
/bin
/sbin/nologin

   ORS

        用于定义awk输出多行内容时的行分隔符,默认换行符

[root@xtyw-master01 ~]# sed -n '1,2p' /etc/passwd | awk -v ORS="--->" -v F=":" '{print $1}'

root:x:0:0:root:/root:/bin/bash--->bin:x:1:1:bin:/bin:/sbin/nologin--->[root@xtyw-master01 ~]# 

NR

        用于记录行号,处理多个文件,行号连续记录

FNR

        用于记录行号,处理多个文件,行号单独记录

[root@xtyw-master01 ~]# awk '{print NR}' /etc/hosts  /shell/fstab 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@xtyw-master01 ~]# awk '{print FNR}' /etc/hosts  /shell/fstab 
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
9
10
11

[root@xtyw-master01 ~]# awk 'NR==3{print $0}' /etc/fstab 
# /etc/fstab

NF

        记录awk分割文件时,每行内容被分割的段数

[root@xtyw-master01 ~]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs   16G     0   16G    0% /dev
tmpfs                   tmpfs      16G     0   16G    0% /dev/shm
tmpfs                   tmpfs      16G  1.7G   15G   11% /run
tmpfs                   tmpfs      16G     0   16G    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs       483G   13G  471G    3% /
/dev/sda1               xfs      1014M  298M  717M   30% /boot
tmpfs                   tmpfs     3.2G   12K  3.2G    1% /run/user/42
tmpfs                   tmpfs     3.2G     0  3.2G    0% /run/user/0
[root@xtyw-master01 ~]# df -hT | awk '{print NF}'
7
7
7
7
7
7
7
7
7
[root@xtyw-master01 ~]# df -hT | awk '{print $NF}'
挂载点
/dev
/dev/shm
/run
/sys/fs/cgroup
/
/boot
/run/user/42
/run/user/0


[root@xtyw-master01 ~]# netstat -antp | awk '{print NF,$NF}'
6 established)
10 name
8 root@pts/
8 master
7 910/rpcbind
7 1620/dnsmasq
7 1265/sshd
7 1259/cupsd
7 1581/master
8 root@pts/
8 root@pts/
7 910/rpcbind
7 1265/sshd
7 1259/cupsd
7 1581/master

三、pattern写法

        1) 数字表达式

                +,-,*,/,%

                ++ , --

                + = 

        2) 字符表达式        

                + 拼接

                "ab" + "cd" = abcd

        3) 比较表达式

                ==,!=,>,>= , <, <=

                字符 ~正则表达式

                字符!~正则表达式

        4) 逻辑表达式

                && 并且

                ||     或者

[root@xtyw-master01 ~]# awk -F : '$3>1000{print $1}' /etc/passwd
nfsnobody
[root@xtyw-master01 ~]# awk -F : '$3>=1 && $3<=99{print$1}' /etc/passwd
bin
daemon
adm
lp
sync
shutdown
[root@xtyw-master01 ~]# netstat -antp |sed '1,2d' |awk '$6=="LISTEN"{print $0}'
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      718/sshd: root@pts/ 
tcp        0      0 0.0.0.0:16443           0.0.0.0:*               LISTEN      1316/nginx: master  
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      910/rpcbind         
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1620/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1265/sshd           
[root@xtyw-master01 ~]# df -hT |sed -n '/^//p' 
/dev/mapper/centos-root xfs       483G   13G  471G    3% /
/dev/sda1               xfs      1014M  298M  717M   30% /boot
[root@xtyw-master01 ~]# df -hT |sed -n '/^//p' |awk '+$5>500{print "磁盘名称:",$1}'
磁盘名称: /dev/sda1
[root@xtyw-master01 ~]# awk -F : '$7 ~ "nologin$"{print "用户名:",$1,"sh名称",$7}' /etc/passwd
用户名: bin sh名称 /sbin/nologin
用户名: daemon sh名称 /sbin/nologin
用户名: adm sh名称 /sbin/nologin
用户名: lp sh名称 /sbin/nologin
用户名: mail sh名称 /sbin/nologin
用户名: operator sh名称 /sbin/nologin

2、 / 正则表达式 /

[root@xtyw-master01 ~]# netstat -antp | awk  '/^tcp/{print $0}'
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      718/sshd: root@pts/ 
tcp        0      0 0.0.0.0:16443           0.0.0.0:*               LISTEN      1316/nginx: master  
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      910/rpcbind    

[root@xtyw-master01 ~]# awk -F: '/nologin$/{print $1}' /etc/passwd
bin
daemon
adm
lp
mail
operator
games
ftp
nobody

[root@xtyw-master01 ~]# awk -F: '/^(r|s)/{print $1}' /etc/passwd
root
sync
shutdown
systemd-network
rpc
saned
saslauth

3、/正则表达式1/,/正则表达式2/

[root@xtyw-master01 ~]# cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Fri Jul 16 17:07:57 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=6dcbb55d-59a5-47a0-a097-c35d94894d14 /boot                   xfs     defaults        0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@xtyw-master01 ~]# awk '/etc/,/dev/{print $0}' /etc/fstab 
# /etc/fstab
# Created by anaconda on Fri Jul 16 17:07:57 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'

4、BEGIN{}

        在处理文本数据之前,执行操作

[root@xtyw-master01 ~]# sed -n '1,3p' /etc/passwd | awk -F: 'BEGIN{printf "\n"}{print $1,$7}'
---开始---
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin

5、END{}

        在文本处理数据之后,执行的操作

[root@xtyw-master01 ~]# sed -n '1,3p' /etc/passwd | awk -F: 'BEGIN{printf "---开始---\n"}{print $1,$7}END{printf "---结束---"}'
---开始---
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
---结束---

四、逻辑控制语句

        1、条件判断语法

                if (条件) {条件为真的操作}

                if(条件){条件为真的操作} else{天剑为假的操作}

                if (条件){条件为真的操作} else if (条件2){条件为真的操作}

[root@xtyw-master01 ~]# awk -F : '{if($3==0){print $1,"是管理员"}else{print $1,"是普通用户"}}' /etc/passwd | sed -n '1,5p'
root 是管理员
bin 是普通用户
daemon 是普通用户
adm 是普通用户
lp 是普通用户

[root@xtyw-master01 ~]# awk -F : -v bash_nu=0 -v nolo_nu=0 '{if($7=="/bin/bash"){bash_nu++}else if($7=="/sbin/nologin"){nolo_nu++}}END{print "bash个数:",bash_nu,"nolo个数:",nolo_nu}' /etc/passwd
bash个数: 2 nolo个数: 40

[root@xtyw-master01 ~]# netstat -antp |awk -v nu=0 '{if($6=="LISTEN"){nu++}}END{print "Listen个数:",nu}'
Listen个数: 14

[root@xtyw-master01 ~]# 
[root@xtyw-master01 ~]# df -hT |awk '/^//{if(+$6>10){print $1,$NF,$6}}'
/dev/sda1 /boot 30%

2、循环

        for(变量;循环条件;改变循环条件的语句){语句;语句;...}

        continue

        break

[root@xtyw-master01 ~]# sed -n '1,2p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin


[root@xtyw-master01 ~]# sed -n '1,2p' /etc/passwd| awk -F: '{for(i=1;i<=7;i++){if(length($i)>4){print $i}}}'/root
/bin/bash
/sbin/nologin

五、数组

        定义数组,在计算机内存中开辟一段连续的空间

        1、定义数组

[root@xtyw-master01 ~]# awk 'BEGIN{cow[1]="1.1";cow[2]="1.2";cow[3]="1.3"}'
[root@xtyw-master01 ~]# 

        2、获取单个数据

[root@xtyw-master01 ~]# awk 'BEGIN{cow[1]="1.1";cow[2]="1.2";cow[3]="1.3";print cow[2]}'
1.2
[root@xtyw-master01 ~]# awk 'BEGIN{cow[1]="1.1";cow[2]="1.2";cow[3]="1.3";print cow[3]}'
1.3
[root@xtyw-master01 ~]# 

        3、获取数组中的所有数据

[root@xtyw-master01 ~]# awk 'BEGIN{cow[1]="1.1";cow[2]="1.2";cow[3]="1.3";for(i=1;i<=3;i++){print cow[i]}}'
1.1
1.2
1.3
[root@xtyw-master01 ~]# awk 'BEGIN{cow[1]="1.1";cow[2]="1.2";cow[3]="1.3";for(i=1;i<=length(cow);i++){print cow[i]}}'
1.1
1.2
1.3

        4、数组支持以任何形式数据作为下标使用

[root@xtyw-master01 ~]# awk 'BEGIN{test["one"]="mouse";test["two"]="cow";test["three"]="tiger";for(i in test){print i}}'
three
two
one
[root@xtyw-master01 ~]# awk 'BEGIN{test["one"]="mouse";test["two"]="cow";test["three"]="tiger";for(i in test){print test[1]}}'



[root@xtyw-master01 ~]# awk 'BEGIN{test["one"]="mouse";test["two"]="cow";test["three"]="tiger";for(i in test){print i,test[1]}}'
three 
two 
one 
[root@xtyw-master01 ~]# awk 'BEGIN{test["one"]="mouse";test["two"]="cow";test["three"]="tiger";for(i in test){print i,test[i]}}'
three tiger
two cow
one mouse

六、awk内置函数

        1、length()

                获取字符串的长度

[root@m1 ~]# awk 'BEGIN{print length("abcd")}'
4

        2、int()

                返回整数

[root@xtyw-master01 ~]# awk 'BEGIN{printf int(13.2)}'
13[root@xtyw-master01 ~]# 

    3、index()返回字符所在的字符串的位置   

[root@m1 ~]# awk 'BEGIN{print index("abcd","b")}'
2

     4、substr(string,start[,length])

取string字符串中的子串,从start开始,取length个;start从1开始计数

[root@m1 ~]# awk 'BEGIN{str="abc abc abc";print substr(str,2,5)}'
bc ab