Linux正则表达式与文本三剑客

TOC

正则表达式

正则表达式符号:

符号 含义作用描述 例子
. 代表单个字符 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行