awk使用

linux三剑客

  • awk使用
  • grep使用
  • sed使用
  • awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。
    实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。
    它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

    awk: 更适合格式化文本,对文本进行较复杂格式处理

    使用方法

    awk 简图

    1
    2
    3
    4
    5
    6
    awk [
    -F<FS字段分隔符> 输入文件折分隔符,fs是一个字符串或者是一个正则表达式
    -v<变量=值> 定义变量
    -f<脚本> 读取awk命令脚本

    ] 'BEGIN{} NR==2{命令;命令;} END{}' 文件

    awk 允许您定义一个 BEGIN 块, 在awk开始处理的时候执行, 一般用来处理FS和一些初始化操作

    awk 还提供了另一个特殊块,叫作 END 块。 awk 在处理了输入文件中的所有行之后执行这个块。通常, END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

    中部为行块可以多个; 花括号前可通过布尔运算查看是否需要执行方法块

    awk变量

    变量名 含义
    $0 当前记录
    $n 当前记录第n个字段
    FILENAME 当前文件名
    FS 输入域分隔符,默认为一个空格(-F定义)
    RS 输入记录分隔符, 默认换行符/n
    NF 当前记录里域个数
    NR 当前记录数
    OFS 输出域分隔符
    ORS 输出记录分隔符
    ARGC 命令行变元个数
    ARGV 令行变元数组
    FNR 当前文件中的记录号

    awk if/循环/数组

    if
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if ($1=="foo"){
    if($2=="foo"){
    print "uno"
    }else{
    print "one"
    }
    }elseif($1=="bar"){
    print "two"
    }else{
    print "three"
    }
    while
    1
    2
    3
    count=1 do {
    print "I get printed at least once no matter what"
    } while ( count !=1 )
    for
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for ( x=1;x<=4;x++ ) {
    if ( x==2 ) {
        continue
      }
    print "iteration", x
    if ( x==3 ) {
        break
      }
    }

    for (x in a) {
    print a[x]
    }
    数组
    1
    a[$1] = $1+2

    内置函数

    函数 说明
    gsub(/正则/, 替换值, 源字符串) 正则表达式替换(全部g模式)
    index(源字符串, “查找字符串”) 查找
    match(源字符串, /正则/) 匹配查找
    substr(源字符串, 开始位置, 截取长度) 截取
    split(源字符串, 分割存放数组, “分割字符串”) 分割

    例子🌰

    常用显示

    1
    $ awk '{print $1}' file.txt // 打印第一字段

    自定义分隔符

    1
    $ awk -F; '{print $1}' file.txt // 定义;分隔符。 使用;分割字段

    统计/etc/passwd的账户人数

    1
    $ awk '{count++;print $0;} END{print "user count is ",count}' passwd

    计算文件占用字节数

    1
    $ ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'

    正则匹配

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 变量 ~ /正则/   
    # 变量 !~ /正则/
    awk 'BEGIN{a="100testaa";if(a~/100/) {print "ok"}}'

    # 匹配所有包含root的行
    awk '/root/{print $0}' passwd

    # 以分号作为分隔符,匹配第5个字段是root的行
    awk -F: '$5~/root/{print $0}' passwd

    数组

    1
    cat /etc/passwd | awk 'NR <= 8 && $2 {a[NR] = $2"-"; print a[NR]} END {print "-----"; for (x in a) print a[x] }'

    执行Shell

    1
    2
    3
    4
    awk 'BEGIN{print "hostname"|"sh"}' // 将hostname字符串打印到sh执行
    awk 'BEGIN{system("df -h")}' // 通过system函数执行
    ls | awk '/.*\.log$/{print "mv "$0,"A_"$0}' | sh // 重命名
    awk -v var=${LANG} '{print var}' // 使用变量

    替换文件

    1
    awk 'gsub(/ /, "", $2); print $0;' // gsub() 返回修改数。下个语句才可以使用修改值

    OFS重构

    1
    2
    3
    4
    # 修改值域的值,下次引用$0时,对$0进行按引用时的OFS进行重构;否则OFS对$0不生效
    # 如果是$0=$0 则表示不重构$0; 对重构进行覆盖
    echo "aaa bbb"|awk '{OFS="#";$1=$1;print $0;}'
    # aaa#bbb
     上一篇

    linux