文本处理grep和sed

一:grep

语法: grep [-cinvABC] ‘word’ filename
-c :打印符合要求的行数
-i :忽略大小写
-n :在输出符合要求的行的同时连同行号一起输出
-v :打印不符合要求的行
-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行
-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行
-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行

1、
image.png

image.png
2、 过滤出带有某个关键词的行并输出行号
image.png
3、过滤不带有某个关键词的行,并输出行号
image.png
4、 过滤出所有包含数字的行

image.png

image.png

在前面也提到过这个”[ ]”的应用,如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符

5、过滤出文档中以某个字符开头或者以某个字符结尾的行

image.png

image.png

在正则表达式中,”^”表示行的开始,"$"表示行的结尾,那么空行则表示"^$",如果你只想筛选出非空行,则可以使用 “grep -v ‘^$’ filename”得到你想要的结果
如何打印出不以英文字母开头的行呢?
image.png

6、 过滤任意一个字符与重复字符
image.png

“.”表示任意一个字符,上例中,就是把符合r与o之间有两个任意字符的行过滤出来。
"*"表示零个或多个前面的字符。
‘.*’表示零个或多个任意字符,空行也包含在内。

7、指定要过滤字符出现的次数

image.png

这里用到了{ },其内部为数字,表示前面的字符要重复的次数。上例中表示包含有两个o 即’oo’的行。注意,{ }左右都需要加上脱意字符’\’。另外,使用{ }我们还可以表示一个范围的,具体格式是 ‘{n1,n2}’其中n1

egrep

1、 筛选一个或一个以上前面的字符

image.png

image.png

和grep的 {2}不同的是,egrep这里是使用’+’的。

2、 筛选零个或一个前面的字符
image.png
3、 筛选字符串1或者字符串2
image.png
4、egrep中’( )’的应用
image.png

二、sed

grep 工具的功能其实还不够强大,其实说白了,grep实现的只是查找功能,而它却不能实现把查找的内容替换掉。以前用vim的时候,可以查找也可以替换,但是只局限于在文本内部来操作,而不能输出到屏幕上。sed工具以及下面要讲的awk工具就能实现把替换的文本输出到屏幕上的功能了,而且还有其他更丰富的功能。sed和awk都是流式编辑器,是针对文档的行来操作的。
1、打印某行 sed -n ‘n’p filename 单引号内的n是一个数字,表示第几行
image.png
2、打印多行 打印整个文档用 -n ‘1,$’p
image.png
3、 打印包含某个字符串的行
image.png
上面grep中使用的特殊字符,如’^’, ‘$’, ‘.’, ‘*’等同样也能在sed中使用。
image.png

image.png

image.png
4、 -e 可以实现多个行为
image.png
5、-d 删除某行或者多行
image.png
6、 替换字符或字符串
image.png

如何删除文档中的所有数字或者字母?


image.png
7、调换两个字符串的位置
image.png
8、直接修改文件的内容

sed -i ‘s/:/#/g’ test.txt ,这样就可以直接更改test.txt文件中的内容了。

1. 删除test.txt 的15行以及以后所有行;
 sed '15,$'d test.txt
2.删除test.txt中5到10行中所有的数字;
 sed '5,10s/[0-9]//g' test.txt
3. 删除test.txt 中所有特殊字符(除了数字以及大小写字母);
 sed 's/[^0-9a-zA-Z]//g' test.txt
4. 把/etc/passwd 复制到/root/test.txt,用sed打印所有行;
 /bin/cp /etc/passwd /root/test.txt ; sed -n '1,$'p test.txt

你可能感兴趣的:(文本处理grep和sed)