1 插入新字符以及格式化空白

  • 将’a b c d’中的b字符,替换成’e f g’

    直接进行替换,在awk中,每次替换之后,会对之前的分隔符(OFS)进行重置。

  • 格式化以下数据

    1
    2
    3
      aaa     bbbbb   cc
    ddd eee ffff
    hhh iii jj kk l
    • 方法一:按空格进行分隔

    • 方法二:按制表符进行分隔

2 提取ipv4地址

  • 提取ifconfig命令中的除了lo网卡之外的所有的ipv4地址

    1
    ifconfig | awk 'BEGIN{RS=""} !/^lo/  {print $6}'

  • 使用正则表达式匹配日志文件中的所有IP地址

    在使用awk的正则表达式的时候,需要指定适应该模块,--re-interval

    后续还可以进行排序与去重

    1
    2
    awk --re-interval '{match($0,/([0-9]{1,3}\.){3}[0-9]{1,3}/,a); print a[0]}' debug.log
    awk --re-interval '{match($0,/([0-9]{1,3}\.){3}[0-9]{1,3}/,a); print a[0]}' debug.log | sort | uniq -c

3 使用awk数组做次数统计

  • 统计netstat -tnap中建立连接的次数

    1
    netstat -tnap | awk '{arr[$6]++}END {for (i in arr){print arr[i], i} }'

    如果只想统计TCP连接的,可以进行过滤:

    1
    netstat -tnap | awk '/^tcp/ {arr[$6]++}END {for (i in arr){print arr[i], i} }'

  • 统计日志中的IP地址数量并降序排序

    通过管道,发送到外部程序sort排序,-r 从大到小,-n 按照数字排序,-k2 以第2列排序。通过将数据丢给第3方的sort命令,所有问题变得非常简单。如果以key值排序 –k2 变成 -k1即可。

    1
    awk '{arr[$4]++}END{for (i in arr){print i, arr[i]}}' log.2021073010-20210730

    1
    2
    awk '{arr[$4]++}END{for (i in arr){print i, arr[i] | "sort -r -n -k2"}}' log.2021073010-20210730
    awk '{arr[$4]++}END{for (i in arr){print i, arr[i] | "sort -r -n -k2"}}' log.2021073010-20210730 | head -10 #取数量最多的前10个

Reference

写在最后

欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。
微信公众号