Linux正则表达式系列

一、特殊符号

1、引号系列

对于Linux大部分命令通用,四剑客目前单独记忆与使用即可

引号 含义
单引号 所见即所得,单引号里面的内容会原封不动输出
双引号 和单引号类似,对双引号里面的特殊符号会进行解析,对于{}花括号(通配符)没有解析
不加引号 和双引号类似,额外支持通配符(匹配文件)*.log{1..10}
反引号 优先执行,先执行反引号里面的命令
swift 复制代码
[root@nanjing ~]# echo '`hostname` shishuwu $(whoami) $UID {1..5}'
`hostname` shishuwu $(whoami) $UID {1..5}
[root@nanjing ~]# echo "`hostname` shishuwu $(whoami) $UID {1..5}"
nanjing shishuwu root 0 {1..5}
[root@nanjing ~]# echo `hostname` shishuwu $(whoami) $UID {1..5}
nanjing shishuwu root 0 1 2 3 4 5

hostname表示执行hostname命令 $(whoami)表示执行whoami命令 $UID表示取出当前用户的uid {1..5}输出12345

2、重定向符号系列

重定向符号 含义 应用场景
> 或 1> 标准输出重定向: 先清空文件,然后写入 大部分情况下先清空的时候可以使用创建文件.
>> 或 1>> 标准输出追加重定向:直接写入到文件未尾. 修改配置文件,表示追加的时候
2> 标准错误输出重定向:先清空文件,然后写入错误信息. 较少单独用,一般用于获取所有输出
2>> 标准错误追加输出重定向:直接把错误写入到文件未尾. 较少单独用,一般用于获取所有输出
```>>1.log 2>&1`` 无论对错都把结果写入到文件中 比较常用,定时任务,脚本中常用
```&>>1.log`` 无论对错都把结果写入到文件中 比较常用,定时任务,脚本中常用
< 或 0< 标准输入重定向 很少用,搭配某一个命令用xargs,tr
<< 或 0<< 标准输入追加重定向 与cat搭配使用表示文件写入多行内容
  • 标准输出重与标准错误输出
csharp 复制代码
[root@nanjing ~]# echo shi 1>>bo.txt
[root@nanjing ~]# cat bo.txt
shi
[root@nanjing ~]# eco shi 2>>bo.txt
[root@nanjing ~]# cat bo.txt
shi
-bash: eco: 未找到命令
  • 同时记录正常输出与错误输出
csharp 复制代码
#选路,如果eco命令正确就执行1>>bo.txt,错误就执行2>>bo.txt
[root@nanjing ~]# eco shi1>>bo.txt 2>>bo.txt 
[root@nanjing ~]# cat bo.txt 
-bash: eco: 未找到命令
#同理2>>bo.txt == 2>&1
[root@nanjing ~]# echo shi>>bo.txt 2>&1
[root@nanjing ~]# cat bo.txt 
shi
[root@nanjing ~]# eco shi>>bo.txt 2>&1
[root@nanjing ~]# cat bo.txt
shi
-bash: eco: 未找到命令
#最简写法
[root@nanjing ~]# echo shi &>>oldboy.log
  • 输入重定向符号(与固定命令搭配)

用于与xargs配合,指定读取文件内容

csharp 复制代码
[root@nanjing ~]# seq 10 > num.txt
[root@nanjing ~]# xargs -n3 <num.txt
1 2 3
4 5 6
7 8 9
10
#xargs-n3 表示分3组
  • 追加输出重定向

<<用于与cat命令实现写入多行内容

格式: cat >文件<<结束标记

结束标记

1、结束标记两边不要有多余符号

2、一般都是事先写好,然后粘贴到命令行执行。

csharp 复制代码
[root@nanjing ~]# cat >>bo.txt<<EOF
> 123456
> EOF
[root@nanjing ~]# cat bo.txt 
shi
-bash: eco: 未找到命令
123456

3、通配符

诞生:用于给linux中大部分命令使用,用于批量找文件名(找文件)

符号 含义
*星号 所有 ,*.txt *.log ' ip '
{}花括号 输出序列,与echo,touch,mkdir.
[] 参考正则中含义即可
[!] [^] 取反
? 任意一个字符
bash 复制代码
#找出/bin目录下面命令,命令仅有2个字符组成.
ls -l /bin/??

二、正则表达式

正则符号都是英文符号,避免使用中文符号

推荐使用grep/egrep命令,默认设置了别名,自动加上颜色

分析正则与正则匹配到的内容------》测试网站

1、符号概述

正则:regular expression RE

正则表达式 regular expression=regexp 符号
基础正则BRE ^ $ . * [] [^]
扩展正则ERE | + () {} ?

2、基础正则

2.1、^ 以什么开头的行

perl 复制代码
[root@nanjing ~]# grep '^m' re.txt
my blog is http://oldboy.blog.5lcto.com
my qq is 490000448
mygod,i am not oldbey,but OLDBOY!

2.2、$ 以什么结尾的行

perl 复制代码
[root@nanjing ~]# grep '8$' re.txt
my qq is 490000448
not 49000000448

显示出文件中特殊的隐藏符号

$是linux中的换行符号,例如第一行在换行前还有一个空格。

ruby 复制代码
[root@nanjing ~]# cat -A re.txt
I am oldboy teacher! $
I teach linux.$
$

那么^m$代表什么呢?

一行只有m

那么^$代表什么呢?

空行

makefile 复制代码
[root@nanjing ~]# grep -n '^$' re.txt
3:
7:
10:
12:

案例一:排除/etc/ssh/sshd_config文件中的空行,然后排除以#号开头的行

perl 复制代码
grep -v '^$' /etc/ssh/sshd_config | grep -nv '^#'

2.3、. 任意一个字符,不匹配空行

grep -o选项,显示正则匹配到了什么? 显示执行过程.

sql 复制代码
[root@nanjing ~]# grep 'ba.l' re.txt 
I like badminton ball ,billiard ball and chinese chess!

2.4、\ 撬棍 转义字符、去掉特殊符号的含义.

案例二:找出文件中以 . 结尾的行

perl 复制代码
grep '.$' re.txt

2.5、* 前一个字符连续出现 0 次或 0 次以上

2.6、 .* 所有,任意字符

.任意一个字符

*前一个字符连续出现0次或0次以上

.*表示所有.

案例三:以任意内容开头直到匹配到am字符的行

css 复制代码
[root@nanjing ~]# grep '^.*am' re.txt
I am oldboy teacher! 
mygod,i am not oldbey,but OLDBOY!

正则表示连续出现的时候或者表示所有的时候,正则体现出贪婪性,尽可能多的匹配.

匹配开头一直到最后一个o的内容。

2.7、 []表示匹配任意1个字符

perl 复制代码
grep '[abc]' re.txt

匹配数字

perl 复制代码
grep '[0-9]' re.txt

匹配小写字母

perl 复制代码
grep '[a-z]' re.txt

匹配大写字母

perl 复制代码
grep '[A-Z]' re.txt

字母匹配大小

perl 复制代码
grep '[a-zA-Z]' re.txt
grep '[a-Z]' re.txt

匹配出以字母m或n开头的行

perl 复制代码
grep '^[mn]' re.txt

匹配出以.或空格或!结尾的行

perl 复制代码
grep '[.!]$' re.txt

温馨提示: []中会自动去掉符号的特殊含义

2.8、 [^abc]表示匹配任意1个字符,排除abc,中括号相当于一个字符

perl 复制代码
grep '[^abc]' re.txt

2.9、正则小结

正则基础 含义
^ 以什么开头
$ 以什么结尾
^$ 空行
. 一个字符
\ 转移符号
* 一个字符出现1次或n次
.* 所有
[] [abc] a或b或c,[]表示一个字符
[^] [^abc]匹配排除abc的内容,[]表示一个字符

3、扩展正则

grep===egrep或 grep -E

sed 使用sed -r 支持扩展正则

awk默认支持扩展正则

perl 复制代码
#Linux三剑客如何支持扩展正则
#grep命令,推荐使用前2个.
egrep '0+' re.txt
grep -E '0+' re.txt
grep '0+' re.txt
#sed 需要使用-r选项 
#awk 直接支持扩展正则

3.1、+ 前一个字符连续出现1次或1次以上

取出连续出现的0

arduino 复制代码
egrep '0+' re.txt

取出连续出现的数字

arduino 复制代码
egrep '[0-9]+' re.txt

取出连续出现的字母(单词)

bash 复制代码
egrep -o'[a-Z]+' re.txt

3.2、 | 或者

文件中包含oldboy或linux的行

arduino 复制代码
egrep 'oldboy|linux' re.txt

排除/etc/ssh/sshd_config文件中的空行,然后排除以#号开头的行

bash 复制代码
egrep -nv '^$|^#' /etc/ssh/sshd_config

3.3、()表示一个整体,用于后向引用(反向引用sed)

检查系统中tree,vim,sl软件是否安装

arduino 复制代码
rpm -qa | egrep '^(tree|vim|sl)'

3.4、{} a{n,m}前一个字符连续出现至少n次,最多m次

格式 应用
a{n.m}前一个字符连续出现至少n次,最多m次 表示连续出现的范围
a{n}前一个字符连续出现n次 匹配固定的次数
a{n,}前一个字符连续出现至少n次
a{,m}前一个字符连续出现,最多m次

匹配IP的正则

csharp 复制代码
[root@nanjing ~]# echo 10.0.0.{1..254} | xargs -n1 > ip.txt
[root@nanjing ~]# egrep '[0-9]{1,3}$' ip.txt

匹配身份证号的正则

css 复制代码
地区: ([1-6][1-9]|50)\d{4}  // 补充重庆地区50
年的前两位: (18|19|20)            1800-2399
年的后两位: \d{2}
月份:((0[1-9])|10|11|12)
天数: (([0-2][1-9])|10|20|30|31)      闰年不能禁止29+
三位顺序码: \d{3}
校验码: [0-9Xx]
// 校验18位的身份证
let _IDRe18 =  /^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/

3.5、? 前一个字符 出现0次或1次

一般用于匹配的内容可能有(出现1次)或者没有出现(出现0次)

3.6、扩展正则小结

扩展正则 含义
+ 前一个字符连续出现1次或多次
| 或者
() 1、表示整体 2、后向引用或反向引用
{} a{n,m}前一个字符连续出现至少n次,最多m次
? 前一个字符出现0次或1次
相关推荐
活跃的煤矿打工人17 分钟前
【星海saul随笔】Ubuntu基础知识
linux·运维·ubuntu
fasewer1 小时前
第五章 linux实战-挖矿 二
linux·运维·服务器
楚灵魈1 小时前
[Linux]从零开始的网站搭建教程
linux·运维·服务器
小小不董1 小时前
《Linux从小白到高手》理论篇:深入理解Linux的网络管理
linux·运维·服务器·数据库·php·dba
这可就有点麻烦了2 小时前
强化学习笔记之【TD3算法】
linux·笔记·算法·机器学习
DY009J2 小时前
深度探索Kali Linux的精髓与实践应用
linux·运维·服务器
程序员-珍2 小时前
虚拟机ip突然看不了了
linux·网络·网络协议·tcp/ip·centos
码农小白3 小时前
linux驱动:(22)中断节点和中断函数
linux·运维·服务器
4647的码农历程3 小时前
Linux网络编程 -- 网络基础
linux·运维·网络
C++忠实粉丝4 小时前
Linux环境基础开发工具使用(2)
linux·运维·服务器