文本三剑客之awk
    awk是一个文本分析工具,相对于grep的查找,sed的编辑,awk优势在于对数据分析后形成的报告
    简单来说: awk就是文本逐行读入,以空格为模式分隔符进行切片,切片部分再进行各种分析处理
    [root@test tmp]# awk —help
    Usage: awk [POSIX or GNU style options] -f progfile [—] file …
    Usage: awk [POSIX or GNU style options] [—] ‘program’ file …
    常用选项:
    -F: 指定分隔符
    -v:指定用户定义变量
    -f:从脚本文件读取awk命令
    pattern:
    模式可以是以下任意一种:
    正则表达式: 使用通配符的一些扩展集
    关系表达式: 使用运算符进行操作,可以是字符串或者数据的比较测试
    模式匹配表达式 :用运算符 ~(匹配) 和 ~!(不匹配)
    BEGIN 语句块, pattern语句块,END语句块
    action:
    动作: 由一个或多个命令、函数表达组成;之间用逗号分隔开来,并位于大括号之内
    主要部分是:变量 数组赋值 输出命令 内置函数 控制流语句等等
    awk常见用法:
    1. 以:号为分隔符,输出/etc/passwd的第一字段内容
    [root@node1 ~]# awk -F: ‘{print $1}’ /etc/passwd
    [root@test tmp]# awk -F: ‘{print $1”用户shell为:”$7}’ /etc/passwd
    $0: 代表整行内容
    2. 匹配模式:关系表达式:条件为GID为996 动作:用户名称
    [root@node1 ~]# awk -F: ‘$4==188 {print $1}’ /etc/passwd
    3. 匹配模式:正则表达式: 以test为开头的行 动作: 输出 用户名和组id
    [root@node1 ~]# awk -F: ‘/^test/{print $1,$4}’ /etc/passwd
    4. 传递变量 动作:输出 用户名称 和 组ID
    [root@node1 ~]# awk -F: -va=3 ‘{print $1,$1+$a}’ /etc/passwd
    5. 匹配模式: BEGIN和END语句
    [root@node1 ~]# awk -F: ‘{print “filename:” FILENAME “,linenumber:” NR “,columns:” NF “,linecontent:”$0}’ /etc/passwd
    [root@node1 ~]# awk -F: ‘BEGIN{print”————————————-\n”}{printf “username:%-16s\tsuserid:%-16s\n”,$1,$4}END{printf N “%-4s records\n”,NR}’ /etc/passwd
    使用-F指定分隔符,-v传递变量参数,输出时有print和printf格式化输出,并且输出多列用,号分割,并且添加BEGIN和END字段。
    BEGIN语句块是awk分析处理前做的事情;END语句块是awk分析处理后做的事情
    awk运算符:
    算数运算符: + - * /
    赋值运算符: = += ..
    逻辑运算符: || &&
    关系运算符: == != > <
    正则运算符: (~,~!) —-> (匹配正则表达式,不匹配正则表达式)


    awk内置变量
    NR:已读的记录数 — 行数
    NF:浏览记录的域的个数 —- 列数(字段数)
    ARGC: 命令行参数个数
    ARGV: 命令行参数排序
    FILENAME: awk浏览的文件名称
    FNR: 浏览文件的记录数
    FS: 设置输入域分隔符,等价于命令-F选项
    …..
    条件和循环语法:
    if (condition) action
    if (condition) action else action
    for (initialisation; condition; increment/decrement) action
    while (condition) action
    break:用以结束循环
    Continue:语句用于在循环体内部结束本次循环,从而直接进入下一次循环迭代
    数组:
    数组使用的语法格式:array_name[index]=value
    删除数组:delete array_name[index]
    多维数组
    函数: