您的位置:首页 > 运维架构 > Linux

linux下字符处理工具grep,sed,awk

2011-11-01 18:40 357 查看
linux下写shell脚本基本上都会或多或少的处理一些琐碎的文本处理,这其中就会使用到不同的文本处理工具或命令,与windows下的batch脚本相比,linux的shell本身也是有一些字符处理的能力的,但是比较难记和使用,而且功能不够强大,使用起来不是很舒服。下面来介绍一下linux中常用的几个文本处理工具:

1 grep 命令

grep [-acivn] "searchstr" 【filename】

参数:

-a 在二进制文件中以文本形式搜索

-c 计算并返回查到到的此数【c代表count】

-i 忽略大小写匹配【i代表ignore case】

-v 反向输出,仅输出与搜索字符不匹配的内容

-n 输出结果的时候同时输出在原文件内的行号

-e 使用扩展正则模式【e代表expand】

"searchstr"

可以是具体的字符串,也可以是正则表达式,当使用正则时可以配合-e参数

filename

指定搜索的原内容,是可选项,不选时默认以当前目录为参数,还可以通过管道命令来传输

2 sed 工具[该工具用于行间的内容操作,如增删改,查找替换]

sed [-nefr] [操作行为] filename

参数:

-n 安静模式,仅显示被处理的行【n代表silent】

-e 在命令行上进行sed操作编辑【e代表edit】

-f 将sed命令写入一个文件内,-f filename 则执行该文件下的sed命令

-r 设置支持扩展的正则表达式

操作行为:

格式1:[n1[,n2]动作]

n1,n2代表操作的范围的起始和终了的行数值,都是可选的。

格式2:/pattern/ 动作

pattern 是字符内容,然后sed会匹配包含该内容的行,可以使用正则匹配

动作的内容有:

a 当前行的下一行新增一行内容【a代表append】

c 替换操作范围内的内容【c代表change】

d 删除操作范围内的内容【d代表delete】

i 当前行的上一行插入一行内容【i代表insert】

p 打印某行行的内容【p代表print】 sed '3p' 打印

s 搜索及替换所搜索的内容,可以使用正则【s代表search】,使用方式类似于vi中的替换句法

格式:s/search/replace/flag

flag: 为数字时代表对第几次匹配的项操作

为g是代表全局范围内适用,global

为p时表示应打印替换后的内容

为w file时表示替换结果写入到指定文件内,而不改变原文件内容

y 转换命令,将指定的字符换为期望的字符,是但字符处理和转换。如sed '2,4y/1234/abcd/'

所有1都转换成a,2->b,3->c, 4->d。若指定了重复的转换则以第一次指定的为准。比如1指定了2个转换符,则第一次指定 的生效

w filename 将选项的内容写入到指定文件中。如:sed '2,4w test.txt' inputfile 将inputfile中的2-4行的内容写入到test文件里

r filename 将从filename文件中读取内容写入到指定的行中。如:sed '2r test.txt' inputfile 是将test文件中的内容读出来写入到inptufile文件的第二行后面,即插入到第三行前面。等价于cat test.txt | sed '2a' inputfile

此外在对操作对象需要进行多种操作行为时可以使用组合命令:

如:

sed '2{s/1234/abcd/g s/abcd/1234/g}'

举例:

last | sed '2,5d' 将删除第二和第五行之间的内容

last | sed '1,20s/^$/test/g' 全局范围内搜索空行并替换为test字符

3 awk 工具【该工具用于处理有字段规则的行内内容,并支持格式化输出】

awk [options] '条件类型1{语句1; 语句2} 条件类型2{语句1;语句2}....' filename

options"

-F fs 指定FS变量的初始值

-f filename 指定读取程序的文件【即存放awk脚本操作的文件】

-v var=value 定义awk的临时变量及值,而后可以在awk中使用变量

-mf N 指定最大的字段数【max field】

-mr N 指定最大的记录数【max record】

-W keyword 指定兼容模式

内置变量:

NF 当前行的字段总数 [number of field]

NR 当前为止已处理的行数,即当前行号 [number of row]

$0,$1,....$n $0代表当前行的内容,$1代表当前行被分割后的第一个字段的内容

FS 当前的字段分割符。默认为空格 [file splitter]

RS 当前的行分割符。默认为回车

FIELDWIDTHS 定义数字字段显示的宽度

OFS 输出字段分割符,默认空格

ORS 输出行分割符,默认回车

条件比较操作符:

>

<

>=

<=

==

!=

用于条件类型的的条件比较运算,通常是用行内变量的比较结果来判断是否执行相应的动作

如:

NF==10

$1>3

条件选项的正则运用:

条件选项可以是任何的表达式,但主要还是利用awk自身的变量值进行判断,当条件为空时默认为无条件执行动作,有条件但为假时则不执行其后的动作;此外条件还可以是正则匹配表达时

如:awk '/^a/ {print $1}' ##当前行匹配以a开头成功时则执行后面的打印

上面正则匹配的范围是整行的内容,如果只想匹配指定字段的内容,则可以这样使用:

awk '$n ~ /^1/ {print $1}' ##通过~符号规定了正则的匹配操作范围【这里是字段n】,~叫做匹配操作符

动作内容:

内容必须放{}大扩弧中,其内就是具体的执行的语句,可以是一句,多句,使用;逗号分割

如:

{print $1 "\t" $2} ##普通输出

{printf "%s \t %s", $1,$2} ##格式化输出

此外awk的语句还可以使用结构化命令,如分支,循环等

如:

if (condition)

{

stat1;

}

else if (condition)

{

stat2;

}

else

{

stat3;

}

while (condition)

{

stat1;

stat2;

}

for (i=1;i<3;i++)

{

stat1;

stat2;

}

注:

awk的执行是按行号依次循环内容的,如果想在所有行执行对awk进行设置并生效的话,那么就需要使用关键字BEGIN

在所有行处理完之后还要做后期处理操作,则可以使用END关键字

如:

awk 'BEGIN { FS=“:”} $1 > 3 {print $1} END {print "END"}' ##在执行第一行之前设置分割符为:冒号。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: