一、Linux中文本处理三剑客:
1、(1)grep,egrep,fgrep:文本过滤工具(模式:pattern)
工具:
grep | 基本正则表达式,grep -E=egrep ,grep -F=fgrep |
---|---|
egrep | 扩展正则表达式,-F,-G |
fgrep | 不支持正则不表达式 |
(2)sed:stream editor,流编辑器;文本编辑工具
(3)awk:Linux中的实现为gawk,文本报告生成器(格式化文本)
2、正则表达式:Regual Expression,简写为REGEXP
由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;
分两类:
基本正则表达式:BRE basic
扩展正则表达式:ERE extend
正则表达式引擎:
3、grep 用法
–color=auto | 高亮显示匹配到的文本 |
---|---|
-i | 忽略字符大小写 |
-n | 显示行号 |
-E | 支持使用扩展正则表达式 |
-o | 打印匹配到的行 |
-v | 显示不能被匹配到的行 |
-A # | 后几行 |
-B # | 前几行 |
-C # | 前后各几行 |
提示:#表示行号
举例
3、元字符
(1)字符匹配
. | 匹配出换行符外的任意字符 |
---|---|
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意空白符 |
\d | 匹配数字 |
\b | 匹配单词开始或结束 |
^ | 匹配字符串开始 |
$ | 匹配字符串结束 |
- | 表示范围 |
[ ] | 匹配括号中的任意一个字符 |
(2)匹配次数
用在要指定出现的次数的字符的后面,用来限制其前面字符出现的次数
* | 匹配其前面的字符任意次。0次,1次或者多次 |
---|---|
.* | 匹配任意长度的任意字符 |
? | 匹配其前面的字符0次或者1次,最多一次 |
+ | 匹配其前面的字符1次或者多次,至少一次 |
{m} | 匹配其前面的字符m次 |
{m,n\ | 匹配其前面的字符至少m次,至多n次 |
{0,n} | 至多n次 |
{m,} | 至少m次 |
举例
显示/etc/passwd文件中不以/bin/bash结尾的行
(3)位置锚定
^ | 行首锚定,用于模式的最左侧 |
---|---|
$ | 行尾锚定,用于模式的最右侧 |
^$ | 空白行 |
^pattern$ | 用pattern来匹配整行 |
<或者\b | 词首锚定,用于单词的左侧 |
>或者\b | 词尾锚定,用于单词的右侧 |
<pattern> | 匹配一个模式字符串 |
4、分组和引用
分组:
\ (\) | 将一个或者多个字符捆绑在一起当做整体处理 |
---|---|
\ (xy)*ab | 命令行中括号有特殊含义所以用转义符 \ |
分组括号中的模式匹配 到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\3
. …
括号可以嵌套不能交叉
引用:
做一个经典的例子: vi loves.txt
He loves his lover.
He likes his lover.
She likes her liker.
She loves her liker.
找到前后一致的单词例如同事love 或者同是like l..e
如果grep "l..e.*l..e" loves.txt 发现四句都可以出现要求前后一样的
grep "\(l..e\).*\1" lovers.txt
后向引用:引用前面的分组括号中的模式所匹配到的字符;
grep "^r..t.*r..t" /etc/passwd 这样前后可能会不一致 一个roo 一个r/ft
grep "^\(r..t\).*\1" /etc/passwd