awk  

格式化的报告生成工具。

能够将指定的文件逐行读入,将读入的内容进行切片,并且可以在内部进行切片的引用。对切片进行各种操作。

#awk [OPTION] 'SCRIPT' FILES

#awk [OPTION] 'PATTERN {ACTION}' FILES

[OPTION]

-F 指定字段分隔符

-v 声明变量。

PATTERN

1.Regexp 正则表达式 /RE/

2.Expression 表达式

3.Ranges 指定匹配范围,格式为PATTERN1,PATTERN2

4.Begin/End 特殊模式,仅在awk命令执行前运行一或者在命令执行后运行一次。可以在BEGIN中定义全局变量。

5.Empty 空模式,匹配任意输入行。

ACTION

print 显示处理后的内容

print ITEM1,TIEM2……

printf 格式化输出 不自动打印换行符,需要要手动\n来换行。

printf FORMAT,ITEM1,TIEM2……

FORMAT:

每个ITEM对应一个FORMAT,各个FOMRAT之间直接连起来写,中间不需要加任何符号,否则会连符号一起输出。

%c 显示字符的ASCII码

%d %i 十进制整数

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

%f 显示浮点数

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

%s 显示字符串

%u 无符号整数

%% 显示%自身

修饰符:

在FORMAT前使用修饰符,加在%后边。

NUM 显示宽度,数值

- 左对齐,默认是右对齐

+ 显示数值符号

分隔符

默认情况下空格作为分隔符。

引用切片:

使用$来引用切片$1 $2 $3等等。

$0 整行。

内置变量:

NF:当前行的字段个数 number of filed。

FS:filed separator 字段分隔符,默认是空白字符。

OFS 输出的段分隔符

输出重定向

print ITEMS > FILE 重定向

print TIEMS >> FILE 追加

print TIEMS | COMMAND 管道

特殊文件描述符:

/dev/stdin 标准输入

/dev/stdout 标准输出

/dev/stderr 标准错误输出

/dev/fd/NUM 特定文件描述符,例如/dev/stdin就相当于/dev/df/0

操作符:

-x 负值

+x 转换为数值

x*y 乘法

x^y 次方

x**y 次方

x/y 除法

x+y

x-y

x%y 取余

字符串操作符:

只有一个,而且不用写出来,用于实现字符串连接。

赋值操作符:

=

如果在某模式为=,此时使用/=/可能会有语法错误,应该以/{=}/替代。

+=

-=

*=

/=

%=

^=

++=

++

--

布尔值:

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

比较操作符:

x < y

x <= y

x > y

x >= y

x ==y

x != y

x ~ y 这里y是模式

x !~ y 这里y是模式。

表达式之间的逻辑关系:

&&

||

条件表达式:

selextor?if-ture-exp:if-false-exp

函数调用:

FUNCITON_NAME(PARA1,PARA2)

控制语句:

1.if-else

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

例如:

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

#awk -F:'{if ($1=="root") print "%15-s;$s/n",$1,"Admin";else printf "%15-s;%s\n" $1,"Common User"}' /etc/passwd

#awk -v sum=0 '{if ($3>=500) sum++}END{print sum}' /etc/passwd

2.while

while (condition)(statment1;statment2;……)

3.do-while

do (statment1,statment2.……) while (condition)

4.for

for(variable assignment;condition;iteration process ) (statment1,statment2,……)

for (1 in array) (statment1,statment2,……)

5.case

switch (expression) (case VALUE OR /REGEXP/;statment1,statment2,…… default; statment1,……)

6.break continue

7.next

结束对本行的处理,直接到下一行

例如:

#awk -F: '{print $1,$7}' /etc/passwd 显示第一个和第七个字段

#awk -F: '{print $NF}' /etc/passwd 显示每一行的最后一个字段。

#awd -v FS=; '{print $1,$7}' /etc/passwd 定义FS变量为;

#awd '{print $1 $7}' /etc/passwd 将$1和$7连在一起输出

#awd -v OFS=:'{print $1,$7}' /etc/passwd 输出的$1和$7之间用:隔开。

#awd  '{printf "%-10s%s\n",$1,$2}' /etc/passwd 第一个字段显示为10个字符的宽度并左对齐,第二字段显示后换行

#awk -F: '{printf "%15-s %i\n",$1,$3 > "/dev/stderr"}' /etc/passwd

#awk -F:'$1 ~ /^root/ {print $3,$4,$NF}' /etc/passwd 比较模式

#awk -F: '/bash/{print $0}' /etc/passwd 使用正则表达式

#awk -F : '$3>=500{print $1}' /etc/passwd 使用判断

#awk -F: '{print "USERNAME      UID";printf "%15-s%s\n,$1,$3"}' /etc/passwd 添加头部修饰

#awk -F: 'BEGIN{print "USERNAME    UID"} {printf "%15-s%s\n,$1,$2"}' /etc/passwd

#awk -F: 'BEGIN{print "USERNAME    UID"} {printf "%15-s%s\n,$1,$2"}END{print "OVER"}' /etc/passwd

#awk -F: 'BEGIN{FS=":"} {printf "%15-s%s\n,$1,$2"}' /etc/passwd 在BEGIN中定义分隔符