awk 学习笔记

  1. 基本语法
    awk [选项] '条件 {动作}' 文件名
    核心逻辑:按行读取,按分隔符切片,对匹配条件的行执行指定动作。



  2. 常用选项
    -F :指定输入文件折分符(默认是空格或制表符)。
    列如-F-(-为分隔符) -F:(:为分隔符)
    例如以冒号 : 分隔: awk -F: '{print $1}' /etc/passwd

  3. 内置变量
    $0 :当前整行内容
    $1 .. $N :当前行的第 N 个字段
    NF :当前行的字段个数(列数)
    $NF 最后一列
    NR :显示当前处理的行号(行数)
    FS :输入字段分隔符(默认空格)
    OFS 输出字段分隔符
    RS输入行分隔符(行)
    ORS 输出行分隔符(行)
    、、
    模式和动作
    1 字符串比较
    awk -F: ' $1 ~ (包含) /^root/ '
    2 操作符匹配
    操作符 含义 示例

    == |等于| $1 == "root"
    != |不等于| $3 != 0
    < |小于| $2 < 100

    |大于| $4 > 1024
    <= |小于等于| $5 <= 10
    = |大于等于| $6 >= 5
    ~ |正则匹配| $1 ~ /^root/
    !~ |正则不匹配| $1 !~ /^ /

    3范围模式
    awk -F: '/开头/,/结尾/'
    4 BEGIN 读取文件前
    5 END 读取文件后



    awk脚本编程
    1.变量
    awk -v user=zhima 'END{print user}' /var/log/nginx/access.log
    2 判断
    awk '{if(条件){动作} }'
    awk '{if (条件) {动作} else {动作}}'
    配合END模式
    awk '{if ($3==0){i++} else{z++}}END{print "i的数量"; print "z的数量"z。}' passwd.txt
    3 循环
    while循环
    语法 while(条件){动作}
    列 {i=1;while(i<=10){print $0;i++}}
    for循环
    for (i=1;i<10;1++){动作}
    4数组
    {username[x++]=$1 }END{for (i in username){print i,username[i]}}
    数组是索引和值组成的 username[索引 可以填固定的数字也可以填自增] = 值(索引对应的内容)for (i in username (就是从头开始索引,有多少索引执行几次){print i,username[i] 输出索引和内容 } )
    awk -F: '{count[$NF]++} END{for (s in count) print s, count[s]}' /etc/passwd 常用计数\
    count[$NF]++ 索引变成了$NF 值是++也就是出现的次数

    count[$NF(最后一列的值)++ ]

  4. 常用实例
    提取某列(注意必须用单引号和 print) :
    df -hT | awk '{print $1}'
    (注意:不能写成 awk $1,必须包裹在 '{print ...}' 中)
    求和计算 :
    awk '{sum += $1} END {print sum}' file

    条件过滤 :
    awk '$3 > 80 {print $1, $3}' file (打印第3列大于80的行的第1和第3列)
← 返回笔记列表