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

来源:互联网 发布:网络塔防游戏手机版 编辑:程序博客网 时间:2024/06/07 03:37
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"}'       ##在执行第一行之前设置分割符为:冒号。
原创粉丝点击