shell编程系列16--文本处理三剑客之awk模式匹配的两种方法

shell编程系列16--文本处理三剑客之awk模式匹配的两种方法


awk的工作模式

第一种模式匹配:RegExp

第二种模式匹配:关系运算匹配


用法格式对照表

语法格式    含义
RegExp        按正则表达式匹配
关系运算    按关系运算匹配

awk模式匹配用法总结:
    第一种方法:RegExp
    第二种方法:运算符匹配

    1、RegExp
        匹配/etc/passwd文件行中含有root字符串的所有行
            awk 'BEGIN{FS=":"}/root/{print $0}' passwd
        匹配/etc/passwd文件行中以nginx开头的所有行
            awk '/^nginx/{print $0}' passwd

    2、运算符匹配
        关系运算符匹配:
            <    小于
            >    大于
            <=    小于等于
            >=    大于等于
            ==    等于
            !=    不等于
            ~    匹配正则表达式
            !~    不匹配正则表达式

        (1)、以:为分隔符,匹配/etc/passwd文件中第3个字段小于50的所有行信息
            awk 'BEGIN{FS=":"}$3<50{print $0}' passwd

        (2)、以:为分隔符,匹配/etc/passwd文件中第3个字段大于50的所有行信息
            awk 'BEGIN{FS=":"}$3>50{print $0}' passwd

        (3)、以:为分隔符,匹配/etc/passwd文件中第7个字段为/bin/bash的所有行信息
            awk 'BEGIN{FS=":"}$7=="/bin/bash"{print $0}' passwd
            
        (4)、以:为分隔符,匹配/etc/passwd文件中第7个字段不为/bin/bash的所有行信息
            awk 'BEGIN{FS=":"}$7!="/bin/bash"{print $0}' passwd
        
        (5)、以:为分隔符,匹配/etc/passwd文件中第3个字段包含3个数字以上的所有行信息
            awk 'BEGIN{FS=":"}$3 ~ /[0-9]{3,}/{print $0}' passwd 

        布尔运算符匹配:
            ||&&!    非
    
        (1)、以:为分隔符,匹配/etc/passwd文件中包含ftp或mail的所有行信息
            awk 'BEGIN{FS=":"}$1=="ftp" || $1=="mail"{print $0}' passwd
        (2)、以:为分隔符,匹配/etc/passwd文件中第3个字段小于50并且第4个字段大于50的所有行信息
            awk 'BEGIN{FS=":"}$3<50 && $4>50{print $0}' passwd


# 模式匹配
# 没有使用 /RegExp/ 匹配模式的时候处理所有的行,使用了匹配模式就只处理匹配到的行
[root@localhost shell]# awk 'BEGIN{FS=":"}/^nginx/{print $0}' passwd 
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin

# 关系运算符,uid 等于1的行
[root@localhost shell]# awk 'BEGIN{FS=":"}$3==1{print $0}' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost shell]# awk 'BEGIN{FS=":"}$7=="/bin/bash"{print $0}' passwd 
root:x:0:0:root:/root:/bin/bash
ajie:x:1000:1000:ajie:/home/ajie:/bin/bash
deploy:x:1001:1001::/home/deploy:/bin/bash

# 匹配uid为3位及以上的行
[root@localhost shell]# awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}' passwd 
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
ajie:x:1000:1000:ajie:/home/ajie:/bin/bash
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
deploy:x:1001:1001::/home/deploy:/bin/bash
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin

# 正则匹配nginx开头的行
[root@localhost shell]# awk 'BEGIN{FS=":"}$1~/^nginx/{print $0}' passwd 
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin

# 匹配到 /sbin/nologin 的行,注意转义
[root@localhost shell]# awk 'BEGIN{FS=":"}$0~/\/sbin\/nologin/{print $0}' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin

# 没有匹配到/sbin/nologin 的行
[root@localhost shell]# awk 'BEGIN{FS=":"}$0!~/\/sbin\/nologin/{print $0}' passwd 
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
ajie:x:1000:1000:ajie:/home/ajie:/bin/bash
deploy:x:1001:1001::/home/deploy:/bin/bash

# 运算和模式匹配混用,找出 uid 小于50,且bash为 /bin/bash 的行
[root@localhost shell]# awk 'BEGIN{FS=":"}$3<50 && $7~/\/bin\/bash/ {print $0}' passwd 
root:x:0:0:root:/root:/bin/bash

 案例:
大量的email被恶意触发阻塞了mq队列,需要进行定时清理避免影响其他业务使用mq,后续寻找问题的源头进行封堵

1.编写清理脚本

cat /usr/local/worksh/email_num_total.sh 
#!/bin/bash
# 统计 email_send 这个 队列的任务个数是否超过 2W,如果超过2W则进行清理  --vhost chinasoft-prod  是指定出现问题的 vhost

email_num=`awk '{$1=="email_send" && total+=$2}END{print total}' /tmp/rabbitmq.txt`

if [[ ${email_num} -gt 20000 ]];then
echo "$email_num>2w"
echo "email:num:${email_num} ,start `date`">>/tmp/clean_send_mail.log
/usr/local/rabbitmq_server-3.8.5/sbin/rabbitmqctl --vhost chinasoft-prod purge_queue email_send
echo "email:num:${email_num} ,end `date`">>/tmp/clean_send_mail.log
fi

2.创建计划任务

# every 3 minitues get rabbitmq queue
*/3 * * * * /usr/bin/rabbitmqadmin -H 127.0.0.1 -P 15672 -u admin -p 'pass' -f tsv -q list queues > /tmp/rabbitmq.txt

# every 6 minitues get mq send_mail queues
*/6 * * * * /bin/bash /usr/local/worksh/email_num_total.sh > /dev/null 2>&1

队列的示例

# cat /tmp/rabbitmq.txt
aliveness-test    0
email_send    0
master_web_es_file    0
master_web_es_user    0
email_send    0
email_send    19251
web_user_recr_error    56
web_user_retry    0

 

posted @ 2019-06-06 14:26  reblue520  阅读(879)  评论(0编辑  收藏  举报