一、Awk 基础语法:
Awk –Fs ‘/pattern/ {action}’ input-file
(或者)
Awk –Fs ‘{action}’ input-file
上面语法中:
-F 为字段分界符。如果不指定,默认会使用空格作为分界符。
 /pattern/和{action}需要用单引号引起来。
 /pattern/是可选的。如果不指定,awk 将处理输入文件中的所有记录。如果指定一个模式,awk 则只处理匹配指定的模式的记录。
 {action} 为 awk 命令,可以是单个命令,也可以多个命令。整个 action(包括里面的所有命令)都必须放在{ 和 }之间。
 Input-file 即为要处理的文件

典型的 awk 程序包含下面三个区域:

  1. BEGIN 区域
    Begin 区域的语法:
    BEGIN { awk-commands }
    BEGIN 区域的命令只最开始、在 awk 执行 body 区域命令之前执行一次。
     BEGIN 区域很适合用来打印报文头部信息,以及用来初始化变量。
     BEGIN 区域可以有一个或多个 awk 命令
     关键字 BEGIN 必须要用大写
     BEGIN 区域是可选的
  2. body 区域
    body 区域的语法:
    /pattern/ {action}
    body 区域的命令每次从输入文件读取一行就会执行一次
     如果输入文件有 10 行,那 body 区域的命令就会执行 10 次(每行执行一次)
     Body 区域没有用任何关键字表示,只有用正则模式和命令。
  3. END block
    END 区域的语法:
    END { awk-commands }
    END 区域在 awk 执行完所有操作后执行,并且只执行一次。
     END 区域很适合打印报文结尾信息,以及做一些清理动作
     END 区域可以有一个或多个 awk 命令
     关键字 END 必须要用大写
     END 区域是可选的**

    AWK文本处理工具
    多个输入文件时如果指定了两个文件,那么 body 区域会首先在第一个文件的所有行上执行,然后在第二个文件的所有行上执行。
    AWK文本处理工具
    二、常用命令
    AWK文本处理工具
    三、内置变量
    AWK文本处理工具
    1.打印命令
    默认情况下,awk 的打印命令 print(不带任何参数)会打印整行数据。与$0有相同作用 ($0代表整条记录)
    awk -F: ‘{print}’ /etc/passwd
    AWK文本处理工具
    awk -F:’{print $0}’ /etc/passwd
    AWK文本处理工具
    2.FS输入字段分隔符
    -F: 与 FS=":’ 有相同作用
    AWK文本处理工具
    awk ‘BEGIN{FS=":"} {print $2,$3}’ /etc/passwd
    AWK文本处理工具
  4. NR – 记录序号
    NR 非常有用,在循环内部标识记录序号。用于 END 区域时,代表输入文件的总记录数。
    awk ‘END{ print NR }’ filename
    AWK文本处理工具
    #统计文件中的行数:只用了END语句块,在读入每一行的时,awk会将NR更新为对应的行号,当到达最后一行NR的值就是最后一行的行号,所以END语句块中的NR就是文件的行数

4 .NF 表示字段数,在执行过程中对应于当前的字段数。
例:查看/etc/passwd中当前字段数AWK文本处理工具
awk ‘{ print $NF }’ /etc/passwd#打印出一行中的最后一个字段;
AWK文本处理工具
awk ‘{ print $(NF-1)}’ /etc/passwd#打印出一行中的最后第二个字段;
AWK文本处理工具
5.外部变量参数传递
AWK文本处理工具

6.awk运算与判断
AWK文本处理工具
7.正则运算符
#~ ~! 匹配正则表达式和不匹配正则表达式
awk ‘BEGIN {a=“100testa”; if(a ~ /^100*/) {print “ok”;}}’
AWK文本处理工具
8.比较运算符
AWK文本处理工具
9.#a>b?y:n 三目运算条件表达式
awk ‘BEGIN{a=“b”;print a==“b”?“ok”:“err”;}’
AWK文本处理工具
10.in 数组中是否存在某键值
awk ‘BEGIN{a=“b”;arr[0]=“b”;arr[1]=“c”;print (a in arr);}’
AWK文本处理工具
awk ‘BEGIN{a=“b”;arr[0]=“b”;arr[“b”]=“c”;print (a in arr);}’
AWK文本处理工具
11.高级输入输出
cat filename
aa 100
bb 353
cc 234
total 1000
awk ‘{if($1==“total”){next};print }’ filename #awk中next语句,相当于其他编程语言的continue
12.简单读取记录
awk ‘BEGIN{ “date” | getline out; print out }’ test
AWK文本处理工具
awk ‘BEGIN{ “date” | getline out; split(out,mon); print mon[2] }’ test
AWK文本处理工具
13.输出到一个文件 输出重定向
datefile文件中为空
echo | awk ‘{printf(“hello word!”) > “datafile”}’
AWK文本处理工具
echo | awk ‘{printf(“hello word!”) >> “datafile”}’
AWK文本处理工具

相关文章: