首页 > 代码库 > awk

awk

 

正则表达三剑客:

grep:文

本过滤器

sed:行编辑器

awk: 报告生成器

GNU AWK :gawk

awk使用的基本语法

awk [options]’program’file file...

awk[options]’’

awk工作原理   切片整行  输入空白符号   默认空格  赋值给内建变量$1 $2...整行$0

$nf  number file

遍历。。。为什么还要循环呢   每一行都有很多字段    如果对每一行的字段   按条件  就需要循环了

awk的输出

print item1,item2

①各项目之间使用逗号分隔,而输出时则使用输出分隔符分隔

②输出的各item可以是字符串或者数值。当前记录的字段 变量或者awk表达式。数值会被隐式转换为字符串后输出

③print后面的item如果省略,相当于print  $0 ,输出空白,使用print””

#awk -F: ‘{print $1}‘ /etc/passwd

#awk -F: ‘{print "hello",$1}‘ /etc/passwd

2.awk的变量

内置变量

自定义变量

2.1内置变量

FS:Field Seperator ,输入时的字段分隔符

#awk ‘BEGIN{FS=":"}{print $1,$7}‘ /etc/passwd

RS:Record Seperator ,输出行分隔符

OFS :Output filed Seperator 输出时的字段分隔符

#awk ‘BEGIN{FS=":";OFS=":"}{print $1,$7}‘ /etc/passwd

ORS:Output Row Seperator 输出时的行分隔符

#awk ‘BEGIN{FS=":";ORS=":"}{print $1,$7}‘ /etc/passwd

NF:numbers of field 字段数

NR:numbers of Record 行数  所有文件的一并计数

FNR:行数 各文件分别计数

#awk ‘BEGIN{FS=":";OFS=":"}{print FNR,$1,$7}‘ /etc/passwd

Awk中引用变量引用无需加$符号

ARGV 数组  保存命令本身这个字符,awk‘{print $0}‘1.txt 2.txt 意味着ARGV[0]保存awk

ARGC 保存awk命令中参数的个数的

awk‘BEGIN{print ARGV[0],ARGV[1]}‘ /etc/passwd /etc/group

awk ‘BEGIN{print ARGV[0],ARGV[1],ARGC}‘ /etc/passwd /etc/group

FILENAME:awk正在处理的当前文件的名称

2.2可自定义变量

-v var_name=VALUE

变量名区分字符大小写;

#awk ‘BEGIN{a="hello awk"}{print a]‘ /etc/passwd

#awk ‘BEGIN{a="hello awk";print a}‘

#awk -v a="hello gawk" ‘BEGIN{print a}

①可以在program中定义变量

②可以在命令行中定义变量:awk中-v的选项

3.awk的printf(打印格式)

命令使用格式:printf format,item1,item2...

要点:

(1)要指定format

(2)不会自动换行,如需换行则需要给出\n

(3)Format用于为后面的每个item指定其输出格式

Format格式的指示符都%开头,后跟一个字符

%c显示字符的ASCII码

%d ,%i 十进制整数

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

%f 显示浮点数

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

%s 显示字符串

%u  显示无符号整数

%% 显示%自身

修饰符:

# 显示宽度

- 左对齐

+ 显示数值的符号

.# 取值精度

#awk -F:‘{printf "%20s,%30s\n",$1,$7}‘ /etc/passwd

#awk -F:‘{printf "%15s,%-20s\n",$1,$7}‘ /etc/passwd

浮点数格式

#awk ‘BEGIN{printf "%f\n",3.1415}‘

浮点数格式#awk ‘BEGIN{printf "%f\n",3.1415926}‘

 

wpsACF.tmp

wpsAD0.tmp

wpsAD1.tmp

wpsAE1.tmp

wpsAE2.tmp

wpsAE3.tmp

4 awk输出重定向

Print items > output-file

Print items  >> output-file

Print items | command

特殊文件描述符

/dev/stdin:标准输入

/dev/stdout:标准输出

/dev/stderr:错误输出

5.awk的操作符

算术操作符:

x+y

x-y

x*y

x/y

x**y,x^y

x%y

-x 负值

+x 转换为数值

赋值操作符

=

+=

-=

*=

/=

%=

^=

**=

++

--

如果模式自身为=号  要写为/=/

比较操作符

<

<=

>

>=

==

!=

~ 模式匹配 左边的字符串能够被右边的模式所匹配  匹配为真 否则为假

!~

subscript in array

逻辑操作符

&&与

|| 或

条件表达式

selector?If-true-expression:if-false-expression   表达式

wpsAF4.tmp

函数调用:

function_name(argu1,argu2)

6.模式

①正则表达式Regexp:格式为/PATTERN/

仅处理被/PATTERN匹配到的行

wpsAF5.tmp

wpsAF6.tmp

②Expression :表达式,其结果为非0或者非空字符串时满足条件

仅处理满足条件的行

wpsAF7.tmp

wpsB08.tmp

③Ranges:行范围,此前地址定界,startline,endline

仅处理范围内的行

④BEGIN/END;特殊模式,仅在awk命令的program运行之前(BEGIN)或运行之后(END)执行一次

⑤Empty:空模式,匹配任意行

7.awk 常用的action

①Expression表达式

②Control statements   控制语句

③Compound statements 组合语句

④Input statements 输入语句

⑤Output statements 输出语句

8控制语句

①if-else语句

格式:if(condition){then body}else{else body}

如果id号大于500 为普通用户  否则为系统用户

wpsB09.tmp

#awk -F: &#8217;{if ($3>=500) {print $1}}&#8217;

wpsB0A.tmp字段数大于8的数

wpsB0B.tmp

②while

格式:while (condition){while body}

例:显示inittab第奇数字段

wpsB1B.tmp

wpsB1C.tmp

length()函数  取字符串的长度  内置函数

字符个数大于等于6的

wpsB1D.tmp

③do-while 循环

格式:do{do-while body}while(condition) 至少循环一次循环体

显示奇数的字段

④for循环

格式:for (variable assignment;condition;iteration process){for body}

wpsB1E.tmp

字段大于等于6的

wpsB2F.tmp

for循环可用来遍历数组元素

语法:for (i in array){for body}遍历元素的缩影

⑤case语句

wpsB30.tmp

语法:switch(Expression){case VALUE or RGEEXP/: statement1;...default: stementN}

⑥循环控制

break

continue

⑦next

提前结束对本行的处理而进入下一行进行处理

显示passwd下奇数行的用户名

wpsB31.tmp

如果某一行id为偶的显示 

wpsB32.tmp

9.数组

array[index-expression]

Index-expression:可以使用任意字符串  如果某数组元素事先不存在,那么在引用时,awk会自动创建此元素并将其初始化为空字串。因此,要判断某数组是否存在某元素,必须使用&#8220;index in array&#8221;这种格式。

例A[FIRST]=&#8217;hello awk&#8217;&#8217;

print A[second]

要遍历数组中的每一个元素,需要使用如下特殊结构

For (var in array) {for body}

其var会遍历array的索引

state[LISTEN]++

state[ESRABLISHED]++

wpsB44.tmp

wpsB59.tmp

删除数组元素

delete array [index]

10.awk的内置函数

wpsB6A.tmp

split(string,array[,fieldsep[,seps]]):

功能 :将sring表示的字符串以fieldsep为分隔符进行切片,并切片后的结果保存至

wpsB6B.tmp

wpsB6C.tmp

wpsB7C.tmp

显示每个ip地址的次数

 

wpsB8E.tmp

wpsB8F.tmp

awk