Quantcast
Viewing all articles
Browse latest Browse all 11063

文本处理工具三剑客之awk

文本处理工具:grep,sed,awk

awk:报告生成器,格式化文本输出

AWK: Aho ,Weinberger,Kernighan

gawk:GNU awk

gawk pattren scanning and processing language

基本语法:gawk [options ] ‘program’ FILE….

program:PATTERN{ACTION STATEMENTS}

语句之间用分号分隔

选项:

-F:指明输入时用到的字段分隔符

-v:var=value:自定义变量


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

print

print item1,item2,…..

要点:

1.以逗号作为分隔符

2.输出的各item可以是字符串,也可以是数字。也可以是当前记录的字段,变量或者awk的表达式

3.如果省略item,相当于print $0

实例:

注意print里面的字符要用引号 引起来


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

如果是变量就不要用引号了


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

省略item相当于print $0,而print “”相当于空,而print “ ”表现是空格


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

2.变量

a,内建变量(分隔符)

FS:inuput field seperator,默认为空白字符

OFS: outputfield seperator,默认为空白字符

RS:inuput recordseperator,输入的换行符

ORS:outputrecordseperator,输出的换行符


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

因为此处只定义了输入时换行符为“”,并没有定义输出换行符,所有默认,在输出的时候空格时要换行

,原默认要换行的时候也会换行


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

NF:number of field,字段数量

{print NF} 显示字段数 {print 1}

,{print $NF}显示最后一个字段,类似于{print $1}


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

NR: number of field,行数 (如果两个文件一起显示,会直接连在一起,不会分开计数)

{print NR} 显示行数


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

FNR:filenumber of field, 各文件分开计数行数


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

FILENAME:当前文件名


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

ARGC:命令行参数的个数

ARGV:数组,保存的是命令行所给定的各参数


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

b.自定义变量

1.-v var=value

变量名区分大小写


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

2.在program中直接定义


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

3.printf命令

格式化输出:printf FORMAT ,item1,item2,….

1.FORMAT是必须要给出的

2.不会自动换行,需要显示给出换行控制符,\n

3.FORMAT需要分别为后面的每个item指定一个格式化符号

格式符:

%c:显示字符的ASCII码

%d,%i:显示十进制整数

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

%f:显示为浮点数

%g,%G:以科学计数法或浮点形式显示数值

%s:显示字符串

%u:无符号整数

%%:显示%自身

换行符记得加上,不然看起来就很蠢了!!


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

每个item都要有一个FORMAT,否则item就不成立了,不显示了


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

修饰符:

#[.#]格式符:

例如%3.1f==>第一个数字控制显示宽度,第二个数字表示小数点后的精度

-:表示左对齐,默认为右对齐

+:表示数值的符号

表示左对齐


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

默认为右对齐


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

4.操作符

算术运算操作符

+,-,*,/,^,% 依次为加减乘除 次方取模

-x:负值

+x:转换为数值

字符串操作符:没有符号的操作符,字符串连接

赋值操作符

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

比较操作符:

>,>=,<,<=,!=,==


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

模式匹配:

~:是否匹配

!~:是否不匹配

逻辑操作符:

&&: 与

||:或

!:非

显示/etc/passwd文件中uid=0或者大于1000的行显示第1,3列,分隔符为”:“


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

显示/etc/passwd文件中uid大于等于0小于等于1000的行显示第1,3列,分隔符为”:“


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

显示/etc/passwd文件中uid不等于0的行显示第1,3列,分隔符为”:“


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

函数调用:

function_name(argu1,argu2,…..)

条件表达式:

selector ? if-true-expression:if-false-expression

如果为真执行true,否则执行false

实例:

如果uid大于1000,则usertype为common,否则为system,,输出每行第一列及变量usertype

awk -F: '{$3>=1000?usertype="common":usertype="system";printf "%15s:%-s\n",$1,usertype}' /etc/passwd
Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

5.PATTERN

1.empty:空模式,匹配每一行;

2./regular expression/:仅处理被此处的模式匹配的行

!/regular expression/:仅处理被此模式匹配的行之外的行

例:显示以UUID开头的行,显示第一列,可个为分隔符

显示不以UUID开头的行,显示第一列,可个为分隔符


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

3.relational expression:关系表达式,结果有”真“有”假“,结果为”真“才会被处理

真:结果为非0值,非空字符串

假:结果为空字符串或0值

示例:


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

4.line ranges:行范围

startline,endline: /pat1/,/pat2/不支持直接给出数字格式

显示从以root开头的行开始,到以nobody开头的行结束,显示第一列,以”:“为分隔符


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

显示行号小于10或者大于40的行,取出第一列,分隔符为”:“


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

5.NEGIN/END模式

BEGIN{}:仅在开始处理文件中的文本之前执行一次

END{}:仅在文本处理完成之后执行一次

示例:


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

结果为真处理,为假不处理


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

显示偶数行和奇数行


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

此例来解释为何上面是奇数和偶数

说明:i初始值为0,第一行i=!i,则i=1,结果为真,处理,所以上面第一行显示

第二行时,i初始值为1,i=!i,则i=0,结果为假,不处理,所有上面第二行没显示,

下面就是循环赋值了,每到技奇数行i=1,偶数行i=0,所以才有上面的效果

(注意1为真,0为假,非1的结果就是假了,而非0的结果就是真了)


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

如果我们使得i的初始值为真,那么结果就和上面的相反了,显示的是偶数行


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

6.常用的action

1.表达式Expressions

2.控制语句Control statements :if while等

3.组合语句Compoundstatements :组合语句

4.输入语句input statements

5.输出语句outut statements :print等

7.控制语句

if (condition) {statements }

if(condition) {statements } else {statements }

while(condition) {statements }

do {statements } while(condition)

for (expr1;expr2;expr3){statements }

break

continue

delete array[index]

delete array

exit

{ statements }

awk控制语句if-else

语法:if(condition) statements [ else statements]

if(condition1) {statement1}else if(condition2) {statement2} esle{statement3}

使用场景:对awk取得的整行或某个字段做条件判断

示例:

如果uid大于1000就显示此行中的第1,3列,分隔符为”:“


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

如果uid大于1000则显示为conmmon user,否则显示system user,并显示第1,3列,分隔符为”:“


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

说明 90分以下为very good 60-90为good,60分以下为不及格
Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

以/dev开头的行,分隔符为%,取第一列,然后显示的行中默认可个为分隔符,最后一行如果大于20,则显示第1行和最后一行


Image may be NSFW.
Clik here to view.
文本处理工具三剑客之awk

awk控制语句=====while循环

语法:while(condition){statement}


Viewing all articles
Browse latest Browse all 11063

Trending Articles