• Shell脚本:三剑客(AWK)


    目录

    1、 工作原理:

     2、基础用法

     3、awk常见的内置变量

    4、题目


    awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目

    前由自由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK

    在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。而awk比较倾向于将一行分成多个字段然后进行处理。AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务

    1、 工作原理:

    前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。

    格式:

    awk [选项] ‘模式条件{操作}’ 文件1 文件2....
    awk -f|-v 脚本文件 文件1 文件2.....

    模式:
    未指定表示 为空

    /1/2/代表正则表达式

    关系表达式

     2、基础用法

    1. [root@localhost ~]#awk ''
    2. #空没有效果
    3. [root@localhost ~]#awk '{print}'
    4. ##在打印一遍
    5. dd
    6. dd
    7. [root@localhost ~]#awk '{print "hello"}'
    8. #字符串需要添加双引号,单引号已被使用
    9. 1
    10. hello
    11. 1
    12. hello
    13. [root@localhost ky15]#awk 'BEGIN {print "hello"}'
    14. #BEGIN比较特殊值打一行
    15. hello
    16. [root@localhost ~]#awk '{print 100}'
    17. #数字不需要
    18. 1
    19. 100
    20. [root@localhost ~]#awk -F: '{print "root"}' /etc/passwd
    21. #打印root 多少行=passwd里的行数

     

     

    1. [root@localhost ky15]#echo {a..b} |awk '{print $1}'
    2. #连续的空白符也可以
    3. a
    4. [root@localhost ky15]#df|awk '{print $5}'
    5. #分区利用率
    6. 已用%
    7. 8%
    8. 0%
    9. 0%
    10. 1%
    11. 0%
    12. 4%
    13. 0%
    14. 1%
    15. [root@localhost ky15]#cat /etc/passwd|awk -F: '{print $1,$3}'
    16. #指定冒号作为分隔符,打印第一列和第三列
    17. [root@localhost ky15]#cat /etc/passwd|awk -F: '{print $1":"$3}'
    18. #用冒号分隔开
    19. [root@localhost ky15]#cat /etc/passwd|awk -F: '{print $1"\t"$3}'

     

     

    1. [root@localhost ~]#df|awk -F"( +|%)" '{print $5}'
    2. [root@localhost ky15]#df |awk -F"[[:space:]]+|%" '{print $5}'
    3. [root@localhost ky15]#df |awk -F"[ %]+" '{print $5}'
    4. 取 ip地址
    5. [root@localhost ky15]#ifconfig ens33|sed -n '2p' |awk '{print $2}'
    6. [root@localhost ky15]#hostname -I|awk {print $1}

     

     

    1. [root@localhost ~]#wc -l /etc/passwd
    2. 45 /etc/passwd
    3. [root@localhost ~]#awk -F: '{print $0}' /etc/passwd
    4. #$0代表全部元素
    5. [root@localhost ~]#awk -F: '{print $1}' /etc/passwd
    6. #代表第一列
    7. [root@localhost ~]#awk -F: '{print $1,$3}' /etc/passwd
    8. #代表第一第三列
    9. [root@localhost ky15]#awk '/^root/{print}' passwd
    10. #已root为开头的行
    11. [root@localhost ky15]#grep -c "/bin/bash$" passwd
    12. #统计当前已/bin/bash结尾的行
    13. 2
    14. ##### BEGIN{}模式表示,在处理指定的文本前,需要先执行BEGIN模式中的指定动作; awk再处理指定的文本,之后再执行END模式中的指定动作,END{}语句中,一般会放入打印结果等语句。
    15. [root@localhost ky15]#awk 'BEGIN {x=0};/\/bin\/bash$/;{x++};END{print x}' passwd
    16. ## 先定义变量
    17. [root@localhost ky15]#awk 'BEGIN {x=0};/\/bin\/bash$/ {x++;print x,$0};END{print x}' passwd
    18. ###

     

     

     

     

     3、awk常见的内置变量

    • FS :指定每行文本的字段分隔符,缺省为空格或制表位。与 “-F”作用相同 -v "FS=:"
    • NF:当前处理的行的字段个数
    • NR:当前处理的行的行号(序数)
    • $0:当前处理的行的整行内容
    • $n:当前处理行的第n个字段(第n列)
    • FILENAME:被处理的文件名
    • RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n

     FS

    1. [root@localhost ky15]#awk -v FS=: '{print $1FS$3}' /etc/passwd
    2. #此处FS 相当于于变量
    3. [root@localhost ky15]#awk -F: '{print $1":"$3}' /etc/passwd

     

    1. shell中的变量
    2. [root@localhost ky15]#fs=":";awk -v FS=$fs '{print $1FS$3}' /etc/passwd
    3. #定义变量传给FS
    4. OFS
    5. [root@localhost ky15]#fs=":";awk -v FS=$fs -v OFS="+" '{print $1,$3}' /etc/passwd
    6. #输出分隔符

     

     NF

    1. [root@localhost ky15]#awk -F: '{print NF}' /etc/passwd
    2. [root@localhost ky15]#awk -F: '{print $NF}' /etc/passwd
    3. #最后一个字段
    4. [root@localhost ky15]#df|awk -F: '{print $(NF-1)}'
    5. #倒数第二行
    6. [root@localhost ky15]#df|awk -F "[ %]+" '{print $(NF-1)}'

     

     

     NR

    1. [root@localhost ky15]#awk '{print $1,NR}' /etc/passwd
    2. ##行号
    3. [root@localhost ky15]#awk 'NR==2{print $1}' /etc/passwd
    4. #只取第二行的第一个字段
    5. [root@localhost ky15]#awk 'NR==1,NR==3{print}' passwd
    6. #打印出1到3 行
    7. [root@localhost ky15]#awk 'NR==1||NR==3{print}' passwd
    8. #打印出1和3行
    9. [root@localhost ky15]#awk '(NR%2)==0{print NR}' passwd
    10. #打印出函数取余数为0行
    11. [root@localhost ky15]#awk '(NR%2)==1{print NR}' passwd
    12. #打印出函数取余数为1的行
    13. [root@localhost ky15]#awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd
    14. [root@localhost ky15]#seq 10|awk 'NR>5 && NR<10'
    15. #取 行间
    16. 6
    17. 7
    18. 8
    19. 9
    20. [root@localhost ky15]#awk '$3>1000{print}' /etc/passwd

     

     

     

     

     

    计算:

    1. [root@localhost ky15]#awk 'BEGIN{i=0;print i++,i}'
    2. 0 1
    3. [root@localhost ky15]#awk 'BEGIN{i=0;print ++i,i}'
    4. 1 1

     

    4、题目

    1. 提取下面的字段中的 IP 地址和时间
    2. 58.87.87.99 - - [09/Jun/2020:03:42:43 +0800] "POST /wp-cron.php?
    3. doing_wp_cron=1591645363.2316548824310302734375 HTTP/1.1" ""sendfileon
    4. 128.14.209.154 - - [09/Jun/2020:03:42:43 +0800] "GET / HTTP/1.1" ""sendfileon
    5. 64.90.40.100 - - [09/Jun/2020:03:43:11 +0800] "GET /wp-login.php HTTP/1.1"
    6. ""sendfileo
    7. [root@localhost ky15]#cat awk.txt | awk -F'[[ ]' '{print $1,$5}'|sed '2d'
    8. 提取host.txt主机名后再放回host.txt文件
    9. 1 www.kgc.com
    10. 2 mail.kgc.com
    11. 3 ftp.kgc.com
    12. 4 linux.kgc.com
    13. 5 blog.kgc.com
    14. [root@localhost ky15]#cat www.txt |awk -F "[ .]" '{print $2}'

    1.统计/etc/fstab文件中每个文件系统类型出现的次数

    2.统计/etc/fstab文件中每个单词出现的次数

    3.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字

    4.提取主机名并放入原文件

    1. [root@localhost ky15]#cat /etc/fstab |awk '/^[^#]/{print $3}'|sort|uniq -c
    2. [root@localhost ky15]#grep -Eo "\b[[:alpha:]]+\b" /etc/fstab |sort |uniq -c
    3. [root@localhost ky15]#echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" |grep -o "[0-9]"
    4. [root@localhost ky15]#cat host.txt |awk -F[/.] '{print $3}'|sort -nr|uniq -c

     

     

     

  • 相关阅读:
    JavaScript 虚拟键盘:Mindfusion JavaScript Keyboard
    使用JPA和Hibernate查询分页
    http基础教程(超详细)
    LeetCode-剑指26-树的子结构
    php中$this->的解释
    Android开发 对接微信分享SDK总结
    OpenLayer7.0 + VSCode开发调试环境
    【C语言基础】:操作符详解(一)
    js 循环拼接逗号
    C语言基础知识
  • 原文地址:https://blog.csdn.net/LBP20001204/article/details/126339907