Linux文本处理工具之grep sed

在Linux系统中,有一个哲学思想:Linux系统下,一切皆文件。
由此可见,有关文本处理的工具有多重要,而我们经常用到文本处理工具主要有grep,sde,以及awk,也就是所称的“文本三剑客”,而在本篇博客中,着重讲解grep和sed的概念及用法,希望对大家的linux学习之路有所帮助,如有不足,请多多指正!

目录
grep概念及解析
grep命令选项
正则表达式及扩展正则表达式
sed概念及解析
sed命令选项

grep概念及解析

grep(global search regular RE ) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用基本的正则表达式来搜索文本,并把匹配的行打印出来。
grep是很常见也很常用的命令,它的主要功能是进行字符串数据的比较,然后符合用户需求的字符串打印出来,但需要注意的是,grep在数据中查找一个字符串时,是以“整行”为单位进行数据筛选的。
egrep命令等同于grep -E,利用此命令可以使用扩展的正则表达式对文本进行搜索,并把符合用户需求的字符串打印出来。
fgrep命令等同于grep -F,它利用固定的字符串来对文本进行搜索,但不支持正则表达式的引用,所以此命令的执行速度也最快。fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。

grep命令选项

--color=auto:对匹配到的文本着色显示
-v:显示不被pattern匹配到的行
-i:忽略字符大小写
-n:显示匹配的行号
-c:统计匹配的行数
-o:仅显示匹配到的字符串
-q:静默模式,不输出任何信息
-A #:after, 后#行
-B #:before, 前#行
-C #:context, 前后各#行
-e:实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
-w:匹配整个单词
-E:使用ERE
-F:相当于fgrep,不支持正则表达式

正则表达式及扩展正则表达式

(1)正则表达式介绍
正则表达式,又称正规表示法、常规表示法(Regular Expression,在代码中常简写为regex、regexp或者RE),正则表达式使用单个字符串来描述、匹配一系列符号某个句法规则的字符串。在很多文本编辑器中,正则表达式通常被用来检索、替换那些符号某个模式的文本。
(2)元字符及定义
^:行首
$:行尾
.:任意单一字符
[ ]:[ ]内任意单一字符
[^] :除[ ]内任意单一字符
前面字符重复不确定次数
+:+前面字符重复一次以上不确定次数
\?:?前面字符重复0或1次
\:转义符
.*:任意长度字符
{n}:前面字符重复n次
{n,}:前面字符重复n次以上
{m,n}:前面字符重复m次和n次之间
[:alnum:]:字母和数字
[:alpha:]:代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:]:小写字母
[:upper:]:大写字母
[:blank:]:水平空白字符(空格和制表符)
[:space:]:所有水平和垂直的空白字符(比[:blank:]包含的范围广
[:cntrl:]:不可打印的控制字符(退格、删除、警铃...
[:digit:]:十进制数字
[:graph:]:可打印的非空白字符
[:print:]:可打印字符
[:punct:]:标点符号
[:xdigit:]:十六进制数字
(3)扩展正则表达式元字符及定义
. 任意单个字符
[ ]:指定范围的字符
[^]:不在指定范围的字符

*:匹配前面字符任意次
?:0或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m,至多n次
^:行首
$:行尾
\<, \b:语首
\>, \b:语尾
|:或,a|b,匹配a或者b
():分组,如N(ame|AME)
()+:多个重复组的判别,如查找A开头B结尾,中间有一个以上的xyz A(xyz)+B

sed概念及解析

sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓存区中,称为"模式空间(pattern space)",接着用舍得命令处理缓冲区中的内容,处理完成后,把缓存区的内容输出。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你是用重定向存储输出。sed主要用来编辑一个或多个文件。
功能:主要用来自动编辑一个或多个文件,简化对文件的反复 操作,编写转换程序等
用法: sed [option]... 'script' inputfile...

sed命令选项

-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式 -i.bak: 备份文件并原处编辑
script: '地址命令'
d: 删除模式空间匹配的行,并立即启用下一轮循环
p:打印当前模式空间内容,追加到默认输出之后
a []text:在指定行后面追加文本 支持使用\n实现多行追加
i []text:在行前面插入文本
c []text:替换行为单行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile:读取指定文件的文本至模式空间中 匹配到的行后
=: 为模式空间中的行打印行号
!:模式空间中匹配行取反处理
sed高级编辑命令
P:打印模式空间开端至\n内容,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模 式空间中的文本,并不会读取新的输入行,而使用合成的模 式空间重新启动循环。如果模式空间不包含换行符,则会像 发出d命令那样启动正常的新循环

以上就是本人在linux学习中对grep,sed的用法和见解,如有不足,请指正!