Linux常用命令之文本分析(六)

hufanglei00 2014-01-22

1.grep

catfile|grepkey:在file中检索包含key的行

key可以是正则,特殊字符需要转意

grep-E正则表达式:

示例:cat/etc/services|grep-E"^#"#打印所有注释行

egrep:一次查询匹配多个内容

例如:egrep'2020|892|10005'/etc/services

2.sed

sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

格式:sed[options]'command'file(s)

实例:

1)删除:d命令

sed'2d'example-----删除example文件的第二行。

sed'2,$d'example-----删除example文件的第二行到末尾所有行。

sed'$d'example-----删除example文件的最后一行。

sed'/test/'dexample-----删除example文件所有包含test的行。

2)替换:s命令

sed's/test/mytest/g'example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。

sed-n's/^test/mytest/p'example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。

sed's/^192.168.0.1/&localhost/'example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加localhost,变成192.168.0.1localhost。

sed-n's/\(love\)able/\1rs/p'example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。

sed's#10#100#g'example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。

3)选定行的范围:逗号

sed-n'/test/,/check/p'example-----所有在模板test和check所确定的范围内的行都被打印。

例子:sed-n'/38685518/,/38685524/p'123456.csv按连续内容截取

grep也有类似方法:

countnum=$[$endnum-$startnum+1]

grep"$startnum"$file-A$countnum

sed-n'5,/^test/p'example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。

sed-n'1,100p'example-----打印第1行到第100百行

sed'/test/,/check/s/$/sedtest/'example-----对于模板test和west之间的行,每行的末尾用字符串sedtest替换。

4)多点编辑:e命令

sed-e'1,5d'-e's/test/check/'example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。

sed--expression='s/test/check/'--expression='/love/d'example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。

3.awk

awk是一个强大的文本分析工具,在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

格式:awk[-Ffield-separator]'commands'input-file(s)

其中,commands是真正awk命令,[-F域分隔符]是可选的。input-file(s)是待处理的文件。

在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

示例:

1)如果只是显示/etc/passwd的账户

cat/etc/passwd|awk-F':''{print$1}'

2)如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割

cat/etc/passwd|awk-F':''{print$1"\t"$7}'

3)如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割

a.而且在所有行添加列名name,shell

cat/etc/passwd|awk-F':''BEGIN{print"name,shell"}{print$1","$7}'

b.在最后一行添加"blue,/bin/nosh"。

cat/etc/passwd|awk-F':''{print$1","$7}END{print"blue,/bin/nosh"}'

c.ab前后都加

cat/etc/passwd|awk-F':''BEGIN{print"name,shell"}{print$1","$7}END{print"blue,/bin/nosh"}'

4)搜索/etc/passwd有root关键字的所有行

awk-F:'/root/'/etc/passwd#正则

5)搜索/etc/passwd有root关键字的所有行,并显示对应的shell

awk-F:'/root/{print$7}'/etc/passwd

A.awk内置变量

ARGC命令行参数个数

ARGV命令行参数排列

ENVIRON支持队列中系统环境变量的使用

FILENAMEawk浏览的文件名

FNR浏览文件的记录数

FS设置输入域分隔符,等价于命令行-F选项

NF浏览记录的域的个数

NR已读的记录数

OFS输出域分隔符

ORS输出记录分隔符

RS控制记录分隔符

此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。

示例:

1)统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容

awk-F':''{print"filename:"FILENAME",linenumber:"NR",columns:"NF",linecontent:"$0}'/etc/passwd

使用printf替代print,可以让代码更加简洁,易读

awk-F':''{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}'/etc/passwd

B.print和printf

awk中同时提供了print和printf两种打印输出的函数。

其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。

printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。

C.awk编程

示例:

1.awk'{count++;print$0;}END{print"usercountis",count}'/etc/passwd

count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。

这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:

awk'BEGIN{count=0;print"[start]usercountis",count}{count=count+1;print$0;}END{print"[end]usercountis",count}'/etc/passwd

2.统计某个文件夹下的文件占用的字节数,单位M

ls-l|awk'BEGIN{size=0;}{size=size+$5;}END{print"[end]sizeis",size/1024/1024,"M"}'

D.条件语句

awk中的条件语句是从C语言中借鉴来的,见如下声明方式:

if(expression){

statement;

statement;

......

}

if(expression){

statement;

}else{

statement2;

}

if(expression){

statement1;

}elseif(expression1){

statement2;

}else{

statement3;

}

示例:

1.检测系统中UID为0的用户

awk-F:'{if($3==0){print$1}}'/etc/passwd

简写:

awk-F:'$3==0{print$1}'/etc/passwd

-F表示使用什么做为分隔符,这里使用冒号,默认是空格

$num表示文件的第几列

'':固定格式,执行命令,这里表示,如果第三列是0,则打印第一列的内容

2.检测系统中密码为空的用户

awk-F:'{if(length($2)==0){print$1}}'/etc/passwd

简写:

awk-F:'length($2)==0{print$1}'/etc/passwd

3.取出第三行,第一列的值

df-h|awk'{if(NR==3){print$1}}'

简写:

df-h|awk'NR==3{print$1}'

E.数组

awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等

示例:

awk-F':''BEGIN{count=0;}{name[count]=$1;count++;};END{for(i=0;i<NR;i++){printi,name[i]}}'/etc/passwd

简写:

awk-F':''BEGIN{count=0;}{name[count]=$1;count++;};END{for(i=0;i<NR;i++)printi,name[i]}'/etc/passwd

F.循环语句

awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。

4.tr

替换文件中的内容

catfile|tr'do''hp':将file中内容为do替换为hp

相关推荐