1 linux上文本处理三剑客:
grep egrep fgrep 文本过滤工具; grep:基本正则表达式,-E -F ;egrep:扩展正则表达 式,-E -F ; fgrep:不支持正则表达式
sed :stream editor ,流编译器;文本编译工具
awk :linux上的实现为gawk,文本报告生成器(格式化文本)
2 正则表达式:
由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能
1)分两类:基本正则表达式;扩展正则表达式
2)基本正则表达式元字符:字符匹配,匹配次数,位置锚定,分组及引用
正则分类:
基础正则 | ^ $ . * .* [] [^] |
扩展正则 | | + () ? |
通配符和正则:
区别 | 处理目标不同 | 支持的命令不同 |
通配符 | 文件/目录 文件名 处理的是参数 | Linux大部分命令都可以使用 |
正则 | 进行过滤,在一个文件中查找内容, 处理的是字符 | Linux三剑客;开发语言python,Golang,java |
3 字符匹配:
. 匹配人以单个字符;
[] 匹配指定范围内的任意单个字符;
[^] 匹配指定范围外的任意单个字符;脱字符
[:digit:] 数字 [:lower:] 小写字母 [:upper:] 大写字母 [:alpha:] 所有字母 [:alnum:] 数字和字母
[:punct:] 所有标点符号 [:space:] 空格
举例:grep "r[[:alpha:]][[:alpha:]]t" /etc/passwd rt中间匹配两个字母
4 匹配次数:
用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;
* 匹配其前面的字符任意次;0,1,多次;例如:grep "x*y"
.* 匹配任意长度的任意字符
\? 匹配其前面的字符0次或1次;即其前面的字符是可有可无的;
\+ 匹配前面的字符1次或多次;即前面的字符要出现至少一次;
精确次数匹配:
\{m\} 匹配其前面的字符m次;例如 grep "x\{1\}y"
\{m,n\} 匹配其前面的字符至少m次,至多n次
\{0,n\} 至多n次
\{m,\} 至少m次
5 位置锚定:
^ 行首锚定;用于模式的最左侧;脱字符
$ 行尾锚定;用于模式的最右侧;
^PATTERN$ 用于PATTERN来匹配整行;
^$ 空白行
^[[:space:]]*$ 空行或包含空白字符的行
单词:非特殊字符组成的连续字符(字符串)都成为单词:
\< 或 \b 词首锚定,用于单词模式的左侧;例如:"\<rooot"
\> 或 \b 词尾锚定,用于单词模式的右侧;例如:"root\>"
\<PATTERN>\ 匹配完整的单词; 例如:"\<root\>"
并且的命令:\+
6 \ 转义字符:脱掉马甲打回原形,去除原有特殊含义
·匹配出文件以 . 结尾的行:grep '\.$' 文件名
7 分组及引用:
\(\) 将一个或者多个字符捆绑在一起,当作是一个整体进行处理;
\(xy\)*ab 命令行中括号有特殊意义所以用转义符 \
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配到的右括号之间的模式所匹配到的字符;
通常用".*\1"
\2:模式从左侧起,第二个左括号以及与之匹配到的右括号之间的模式所匹配到的字符;
\3:模式从左侧起,第三个左括号以及与之匹配到的右括号之间的模式所匹配到的字符;
……
括号可以嵌套不能交叉
经典的例子:找到前后一致的单词,例如同事 love 或者同事 like (l..e)
如果grep "l..e.*l..e" love.txt 发现四句都可以出现要求前后一样的,此时就需要使用分组括号中的模式匹配 grep "\(l..e\).*\1"
后向引用:引用前面的分组括号中的模式所匹配到的字符