今天我们简单的总结一下正则表达式,linux系统下的正则表达式和其他语言下的正则表达式有一点小的区别,不过初学者就不用考虑那么多了,基本上在linux下的正则表达式的使用方法在其他地方一样的适用。
说来说去那么什么是正则表达式呢?
正则表达式就是用于字符串的模式分隔、匹配、查找以及替换操作,其重点在于匹配(即模糊匹配)
和正则表达式相像的有一个东西叫做通配符,通配符又是什么呢?
通配符其实和正则表达式的定义差不多,都是用于字符串的匹配,那么两个有什么区别呢?
通配符:用于文件名的匹配,完全匹配(即必须一模一样),对于文件操作的命令可以使用
正则表达式:用于匹配文件中的数据,包含匹配(包含匹配字符串即可以匹配成功),对于文件内容操作的命令可以使用分为:基础正则表达式和扩展正则表达式
简单的通配符介绍:
*:表示匹配任意内容
?:表示匹配任意一个内容[]:表示匹配括号内任意一个字符
由于正则表达式太多过于复杂,这里先简单的总结基础正则表达式,扩展的正则表达式以后再予以总结:
*:前一个字符匹重复0次,或者任意多次(单独使用没有任何作用) 例如:"aa*" 会匹配到以一个a开头的所有内容
.:匹配除了换行符意外的任意一个字符 例如:"a..b" 会匹配到所有的以a开头,b结尾,字符数为4的所有内容 "a.*b" 匹配以a开头,b结尾的所有行 ".*" 匹配所有行
^:匹配行首 例如:"^a" 匹配以a开头的所有行
$:匹配行尾 例如:"a$" 匹配以a结尾的所有行 "^$" 匹配空白行(利用-n参数显示行数)
[]:匹配括号内任意一个字符
例1:"a[cde]b" 匹配a开头,b结尾,中间字符为cde其中任意一个字符的内容 例2: "^[ab]" 匹配以a或者b开头的所有行
[^]:匹配除括号内字符意外的任意一个字符 例如:"^[^a-z]" 匹配以非a-z开头的行
\:转义符 例如:"\.$" 匹配以.结尾的行,而不是以任意字符结尾的行
\{n,\}:匹配前一个字符不少于n次 例如:"a\{3,\}" 匹配a出现3次以上的行
\{n,m\}:匹配前一个字符出现n到m次 例如:"a\{1,3\}" 匹配a出现1次到3次的行
注意:最后3个正则表达式必须要有定界符来匹配才有用,不然没有什么区别
正则表达式举例:
1、[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} 用于匹配日期,格式为"YYYY-MM-DD"
2、[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\} 用于匹配IP地址,格式为"255.255.255.255" 只是简单匹配,完全匹配一个IP是无法实现的
刚刚介绍完了正则表达式,各位读者肯定在想什么地方可以用得上呢?
都说了正则表达式是用于匹配的,那么肯定和文件内容操作的命令密不可分了,一般来说配合grep,cut,sort,awk,sed等命令,加上管道符,正则表达式就可以大放异彩
grep,cut和sort命令我们已经在前面的章节介绍过了,这里就不做介绍了
我们直接进入awk命令,但是在此之前我们先要介绍一个输出命令,printf
格式: printf '输出类型 输出格式' 【内容】
输出类型:
%ns:输出字符串,n代表n个字符(一般可以不加n)
%ni:输出整数
%m.nf:输出浮点数 例如:%8.2f 一共8位数,其中2位是小数
输出格式:
\a:输出警告音
\n:换行
\t:Tab键
\r:回车
\b:输出退格键
例如:printf %s 1 2 3 4 输出为1234
注:其实这个命令没有什么特别需要掌握和了解的,一般感觉也用不上,用上了再man一下看看就行了,只需要知道用于打印就行了
接下来就是我们的正主了,awk命令,其实awk和cut有很多相似的地方,都是内容截取命令,都是竖行截取,但是awk比cut强大太多了
这里我们只说一下简单的一些使用方法
awk命令:内容截取命令(默认以Tab键(或者空格)作为分隔符,cut命令是无法以空格作为分隔符的)
格式:awk '条件1{动作1}条件2{动作2}....' 【文件名】 (这个条件和动作可以写很多很多,并没有限制)
动作:一般为输出,也可以为流程控制语句(初学者不需要掌握)
说那么多没有什么用,直接来几个例子吧
例1:df -h | awk '{print $1 "\t" $3}' 截取df命令查看后的第一和第三列
例2:df -h | awk 'BEGIN{print "abc:"}{print $1 "\t" $3}' 先输出“abc:”,之后再输出df查看的第一和第三列(如果是输入的END则是在最后输出)
例3:awk 'BEGIN{FS=":"}{print $1 "\t" $3}' 以":"作为分隔符取出第一和第二列 (通过这个例子,可以知道awk可以完美兼容cut,只是比较复杂)
例4:awk '$3>=60{print $2}' 如果第三列的数字大于等于60则输出其第二列
sed命令:替换命令(无需打开文件,直接对文件内容就可以进行修改)
格式:sed 【选项】 '动作' 【文件名】
常用选项:
-n:只输出改变了的行(默认输出全部文件)-e:允许执行多条动作,用;隔开
-i:对文件直接操作(默认是显示在终端,但是不对文件进行操作,注意使用!!!)
常用动作:
a:追加
c:行替换
s:字符替换 格式:"行范围s/旧字符串/新字符串/g"(和vim中相似)
i:插入
p:打印
d:删除
和awk命令一样,直接来几个例子吧
例2:sed '2,4d' 【文件名】 删除第二行到第四行后打印文件(没有-i参数所以源文件不改变)
例3:sed '2a abc' 【文件名】 在第二行后面加入abc(即在第三行)
例4:sed '2i abc' 【文件名】 在第二行前面加入abc(即在第二行,原来的第二行变为了第三行)
例5:sed '2s/70/100/g' 【文件名】 将第二行的“70”替换为“100”
例6:sed -e 's/70/100/g;s/80/110/g' 【文件名】 将全文中的“70”换为“100”,“80”换为“110”
注:sed命令也是一个强大和常用的文件内容操作命令,需要经常使用来熟练它
这部分就到此为止了,希望可以对各位读者有所帮助