awk

使用外部脚本

任何严肃的开发工作都因采用外部脚本

awk -f myscript.awk myfile.in
BEGIN {
    FS = ":"
}

{
    print $0
}

选择行

在某种程度上可以取代grep指令的功能

BEGIN {
    FS = ":"
}

! /^$/ { #只处理非空的行
    print $0
}

以上脚本等同于

BEGIN {
    FS = ":"
}

{
    if ($0 !~ /^$/) {
        print $0
    }
}

再看一个例子

BEGIN {
    FS = ":"
}

$2 == "root" {
    print $0
}

使用数字

BEGIN { x == 0 }
! /^$/ {
    x ++
}
END {
    printf "非空行共有%d行\n", x
}

其实字符串有时也可以当做数字来处理

BEGIN {
    x = "3.1415926"
}
{
    x = x + 1
}

常用的运算符

  • + - * / %: 算术运算,与C语言中的运算符意义一致
  • && || !: 逻辑运算,与C语言中的运算符意义一致
  • ++ --: 自增自减运算,与C语言中的云算法意义一致,awk语言也包含post,pre两种自增运算和自减运算。
  • == !=: 相等/不等
  • ~ !~: 正则匹配/正则不配

流程控制

与C语言相似

BEGIN {
    num = 10
}

{
    if ($1 == "foo") {
        print $1, $2, $3
    } else {
        print $1, $2, $4
    }

    for (i = 0; i < 100; i++) {
        print $1, $2, $3
    }

    while (1) {
        print $1, $2, $3
        if ($2 == "root") {
            break
        }
    }

    do {
        print $7, $8

        if ( num == 4 ) {
            continue
        }

        num --
    } while (num != 0)
}

常用隐含变量

BEGIN {
    FS = "[[:space:]+]"  # Filed Separators (正则) (输入)
    RS = "\n"            # Record Separators (字符串) (输入)

    OFS = ""             # Output Filed Separators (字符串) (输出)
    ORS = "\n"           # Output Record Separators (字符串) (输出)
}

{
    print NF            # Number of Field  (数字)
    print NR            # Number of Record (数字)
}

results matching ""

    No results matching ""