grep:文本过滤器

sed:流编辑器

awk:报告生成器


1、awk的输出:

print

awk 'BEGIN {print "line one\nline two\nline three"}'

awk -F: '{print $1,$2}' \etc\passwd


printf

%c 显示字符的ASCII码

%d %i 十进制整数

%e %E 科学计数法显示数值

%f 显示浮点数

%g %G 以科学计数法的格式或浮点数的格式显示数值

%s 显示字符串

%u 无符号整数

%% 显示%自身


修饰符

N 显示宽度

- 左对齐

+ 显示数值符号

awk -F: '{printf "%-15s %E\n",$1,$2}' /etc/passwd


2、awk的变量

内置变量:

FS:列分隔符

RS:行分隔符

OFS:输出的列分隔符

ORS:输出的行分隔符

NR:命令所处理的记录数(行数),多个文件的总处理数

NF:命令所处理的列数

FNR:命令所处理的当前文件的记录数(行数)


两种定义变量方式:

awk -v var="test" 'BEGIN{print var}'

awk 'BEGIN{var="test";print var}'


3、awk的操作符

算数操作符:

-x 负值

+x 转换为数值

x^y

x**y 次方

x+y

x-y

x*y

x/y

x%y


字符串操作符



赋值操作符

=,+=,-=,*=,/=,%=,^=,**=,++,--


布尔值

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

<,<=,>,>=,==,!=,~,!~,subscript in array


逻辑关系

&&,||


条件表达式

selector?if-true-exp:if-false-exp


函数调用

function_name(para1,para2)


4、awk的模式

常见模式类型:

Regexp:正则表达式,格式为/regular expression/,如:awk -F: '/^r/{print $1}' /etc/passwd

expression:表达式,其值非0或为非空字字符时满足条件,如:$1 ~ /foo/ 或 $1 == "test"

Ranges:指定匹配范围,格式为pat1,pat2,如:$3==0,$7^"nologin"

BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次

Empty:空模式,匹配任意输入行


常见的Action

Expressions:

Control statements:

Compound statements:

Input statements:

Output statements:


5、控制语句

if (condition) {then-body} else {[else-body]}

awk -F: '{if ($1=="root") print $1,"Admin"; else print $1,"Common User"}' /etc/passwd


while (condition){statement1;statement2;...}

awk -F: '{i=1;while (i<=3) {print $i;i++}}' /etc/passwd


do {statement1;statement2;...} while (condition)

awk -F: '{i=1;do {print $1;i++}while(i<=3)}' /etc/passwd


for (variable assignment;condition;iteration process) {statement1;statement2;...}

awk -F: '{for(i=1;i<=3;i++) {print $i}}' /etc/passwd


switch (expression) {case VALUE or /REGOEXP/:statement1;statement2;... default:statement1;statement2;...}


break,continue

常用语switch中


next

提前结束对本行文本的处理,并接着处理下一行


6、awk中使用数组

array[index-expression],默认下标从1开始

遍历数组

for (var in array) {statement1;statement2;...}

netstat -tan | awk '/^tcp/{STATE[$NF]++}END{for(S in STATE) {print S,STATE[S]}}'