Linux正则表达式与文本三剑客
正则表达式
正则表达式符号:
| 符号 | 含义作用描述 | 例子 |
|---|---|---|
| . | 代表单个字符 | a…b可以表示为a开头b结尾中间有两个字母的字符串 |
| * | 匹配除了*前一个字符 | abc*匹配ab字符不管c |
| ^ | 匹配以什么开头 | ^adc匹配到adcddjij之类的 |
| $ | 匹配以什么结尾 | abc$匹配到dhduhduabc之类的 |
| .* | 匹配任意个字符 | 相当于.符号,不过是无数位 |
| \ | 转义符 | $显示出$内容 |
| [] | 表示一段范围 | [0-9]或者[a-z]或者[A-Z] |
| {} | 匹配最少多少最多多少 | {n,m}至少n个最多m个 |
| [^]或[!] | 匹配除了^以外的 | [^acb]除acb以外的字符串 |
| *\{n\}* | 匹配匹配了n次或以上 | [0-9]/{/11}匹配只有0-9之间匹配了11位 |
扩展正则表达式元字符:
| 符号 | 作用描述 |
|---|---|
| | | 以或的方式匹配字符串 |
| + | 匹配前面子表达式1次或1次以上 |
| ? | 匹配前面子表达式0次或1次 |
| () | 将()中的字符作为一个整体 |
Linux文本三剑客
文本三剑客分别是grep、awk、sed
grep命令
用于过滤筛选哪一行的内容
语法:grep【选项】【关键字】【文件名】
-v:显示除了关键字匹配到的行
-i:忽略字符大小写
-n:显示匹配的行号
-c:统计匹配的行数
-o:仅显示匹配到的字符串
-q:不输出任何信息
-A:n:after,后n行
-B:n:before,前n行
-C:n:context,前后各n行
-e:实现多个选项间的逻辑or关系
-w:整行匹配整个单词
-E:启用扩展正则表达式(Extended Regular Expressions,ERE)
例如:
# 过滤a.txt文件中带有error的行
grep error a.txt
awk命令
用于过滤筛选哪一列的内容
语法:awk【选项】“隔离符” ‘{ print 位置}’【文件名】
-F:指定输入字段分隔符
-v:在脚本开始前为变量赋值
-f:从指定文件读取awk脚本
-W:启用警告,帮助检测脚本中的潜在问题
例如:
awk -F ":" '{print ”过滤后的内容为:”$1 $3}' /etc/passwd
#还可以打印选择多少行,比如打印20到30行的过滤后的信息
awk -F ":" 'NR>=20 && NR<=30{ print "20到30行:" $3}' /etc/passwd
#如火需要打印最后一列或者倒数第一列
awk -F ":" '{print "倒数第二列:"$(NF-1) "最后一列:"$(NF)}' /etc/passwd
sed命令
处理修改文本文件且输出到屏幕(控制台)
语法:sed【选项】【脚本命令】【文件名】
-e:可以指定多个脚本命令
-f:将其后文件中的脚本命令添加到已有的命令中
-n:默认输出运行完脚本命令处理后的结果,不修改源文件
-i:直接运行完脚本修改源文件
脚本命令选项:
a:在多少行后新增内容
sed '2a testContent' test.txt #在第2行后面新增一行内容
sed '1,3a testContent' test.txt #在原文的第1~3行后面各新增一行内容
i:在多少行前插入内容
sed '2i testContent' test.txt #在第2行前面插入一行内容
sed '1,3i testContent' test.txt #在原文的第1~3行前面各插入一行内容
c:整行替换
sed '2c testContent' test.txt #将第2行内容整行替换
sed '1,3c testContent' test.txt #将第1~3行内容替换成一行指定内容
s:文字替换
sed 's/old/new/' test.txt #匹配每一行的第一个old替换为new
sed 's/old/new/gi' test.txt #匹配所有old替换为new
(g代表一行多个,i代表匹配忽略大小写)
sed '3,9s/old/new/gi' test.txt #匹配第3~9行所有old替换为new
d:删除
sed '2d' test.txt #删除第2行
sed '1,3d' test.txt #删除第1~3行
p:打印输入文件
sed -n '2p' test.txt #只打印第2行
sed -n '1,3p' test.txt #只打印第1~3行