awk 报告生成器 学习笔记

awk的作用 格式化以后,显示

nawk

gawk linux版本 gnome awk

AWK: Aho, Kernighan and Weinberger

基本使用

awk [options] 'script' file1 file2, ...

awk [options] 'PATTERN {action}' file1 file2, ...

print
printf // 格式化输出

this is a text

awk 使用分隔符对文本进行切片

使用空格分成 this($1) | is($2) | a | text 四部分

$0 为整个文本

awk '{print $1,$2}' test.txt

-F : 指定分隔符 输入时的分隔符

awk 'BEGIN{OFS="#"}{print $1,$2}' test.txt // 指定输出分隔符
  1. 各个项目之间用逗号隔开,输出时以空白字符分割
  2. 输出的tiem可以为字符串或数值,当前记录的字段(如$1),变量或awk的表达式:数值会先转为字符串,然后输出
  3. print 后面的 item 可以省略 ,相当于 print $0 想输出空白行 => print “”

    awk ‘BEGIN{OFS=”#”}{print $1, “hello”,$2}’ test.txt

awk 变量

  1. awk 内置变量之记录变量
    1. FS: field separator 输入文本信息所使用的字段分割符
    2. RS: Record separator 输入文本信息所使用的行分隔符
    3. OFS: Output Field Separator 输出字段分隔符
    4. ORS: Output Row Separator 输出时行分隔符
awk -F:    // 读取文件以冒号作为分隔符
OFS="#"
FS=":"
  1. awk 内置变量之数据变量

    1. NR: The number of input records, awk命令处理的记录数 (绝对计数)
    2. NF: Number of Field, 当前记录的field(字段)个数
    3. FNR: 与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数.(相对计数,不同文件中,重新计数)
    4. ARGV: 数组,保存命令行本身这个字符串, 如 awk ‘{print $0}’ a.txt b.txt 这个命令中,ARGV[0]保存的是awk ,ARGV[1]保存的是a.txt
    5. FILENAME: awk命令所处理的文件的名称
    6. ENVIRON: 当前shell环境变量机器值得关联数组 如: awk ‘BEGIN {print ENVIRON[“PATH”]}’
  2. 用户自定义变量

允许用户自定义变量, 变量名有格式
awk -v test="hello awk" 'BEGIN {print test}' // 输出 hello awk
awk 'BEGIN{test="hello awk"; print test}' // 输出 hello awk\

BEGIN选项可以让awk不用输入文件

printf的使用

awk 'BEGIN{printf "%c", "a"}'
awk '{printf "%s", $1}' test.txt
awk '{printf "%10s", $1}' test.txt
awk '{printf "%-10s", $1}' test.txt
awk '{printf "%-10s%-10s", $1,$3}' test.txt
awk -F: '{printf "%5d", $3}' /etc/passwd
  • %c: 显示字符的ASCII码
  • %d,%i: 十进制整数
  • %e,%E: 科学计数法显示数值
  • %f: 显示浮点数
  • %g, %G: 以科学计数法的格式或浮点数的格式显示数值
  • %s: 显示字符串
  • %u: 无符号整数
  • %%: 显示%本身

修饰符

  • N: 显示宽度
  • -: 左对齐
  • +: 右对齐

awk的操作符

  1. 算术操作符
  • -x: 负值
  • +x: 转换为数值
  • x^y:
  • x**y: 次方
  • x*y: 乘法
  • x/y: 除法
  • x-y:
  • x+y:
  • x%y:
  1. 字符串操作符
  • 只要一个不用写出来,用户字符串的连接
  1. 赋值操作符
=,+=,-=,*=,/=,%=,^=,**=,++,--

需要注意的是,如果某模式为=号,此时使用/=/可能会有语法错误,应该用/[=]/替代

  1. 布尔值

awk中,任何非0值或非空字符串都为真,反之为假

  1. 比较操作符
<, <=, >, >=, ==, !=, ~, !~  
x~y x匹配y的模式
x!~y x不匹配y的模式
~:匹配模式
  1. 逻辑关系符:
&& , || 
  1. 条件表达式
selector ? if-true-exp:if-false-exp
a = 3
b = 4
a > b ? a is max : b is max
  1. 函数调用
function_name (para1, para2)

awk 模式

awk ‘program’ input-file1 input-file2 …
program 为:
pattern { action }
pattern { action }

常见的模式类型

  1. RegExp: 正则表达式,格式为 /regular expression/
  2. expression: 表达式,其值为真时匹配. 如: $1~/foo/ 或 $1 == “aaa” , ~(匹配)和!~(不匹配)
  3. Ranges: 指定的匹配范围,格式为 pat1,pat2
  4. BEGIN/END: 特殊模式,仅在 awk 命令执行前运行一次或结束前运行一次
  5. Empty(空模式): 匹配任意输入行
1
2
3
4
5
awk -F: '/^r/{print $1}' /etc/passwd // 匹配以r开头的行
awk -F: '$3>=500{print $1, $3}' /etc/passwd // 匹配id大于500的行
awk -F: '$7~"bash$"{print $1,$7}' /etc/passwd // 第七个字段是否能被模式匹配到
awk -F: '/^r/,/^m/{print $1,$7}' /etc/passwd // 匹配模式中间的行
awk -F: 'BEGIN{print "Username ID Shell"}{printf "%10s%10s%10s", $1,$3,$7}END{print "End of report."}' /etc/passwd // 在执行前和执行后执行一次

常见的Action

  1. Expressions:
  2. Control statements 控制语句 if-else
  3. Compound statements 复合语句
  4. Input statements 输入语句
  5. Output statements 输出语句

控制语句

  1. if-else
  2. while
  3. do-while
  4. for
  5. switch-case
awk -F:' 
{
    i=1;
    while (i<=NF) 
    {
        if (length($i)>=4) 
        print $i; i++
    }
}' /etc/passwd

for (A in state) {
    print A,state[A]
}

应用: df -hP 之后取出使用率大于等于50的
netstat -tan 取出LISTEN的数量