Linux正则表达式系列相关知识

一、特殊符号

1、引号系列

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

引号含义
单引号所见即所得,单引号里面的内容会原封不动输出
双引号和单引号类似,对双引号里面的特殊符号会进行解析,对于{}花括号(通配符)没有解析
不加引号和双引号类似,额外支持通配符(匹配文件)*.log{1…10}
反引号优先执行,先执行反引号里面的命令
#单引号
[root@yunwei ~]# echo '`hostname` test $(whoami) $UID {1..5}'
`hostname` test $(whoami) $UID {1..5}
#双引号
[root@yunwei ~]# echo "`hostname` test $(whoami) $UID {1..5}"
yunwei test root 0 {1..5}
#不加引号
[root@yunwei ~]# echo `hostname` test $(whoami) $UID {1..5}
yunwei test 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搭配使用表示文件写入多行内容
  • 标准输出重与标准错误输出
#标准输出重定向
[root@yunwei ~]# echo 123 >> test.txt
[root@yunwei ~]# cat test.txt
123
#标准错误重定向
[root@yunwei ~]# eco 456 2>> test.txt
[root@yunwei ~]# cat test.txt
123
-bash: eco: 未找到命令

  • 同时记录正常输出与错误输出
#选路,如果eco命令正确就执行1>>bo.txt,错误就执行2>>bo.txt
[root@yunwei ~]# eco shi1>>bo.txt 2>>bo.txt 
[root@yunwei ~]# cat bo.txt 
-bash: eco: 未找到命令
#同理2>>bo.txt == 2>&1
[root@nyunwei ~]# echo shi>>bo.txt 2>&1
[root@yunwei ~]# cat bo.txt 
shi
[root@yunwei ~]# eco shi>>bo.txt 2>&1
[root@yunwei ~]# cat bo.txt
shi
-bash: eco: 未找到命令
#最简写法
[root@yunwei ~]# echo shi &>>all.log
  • 输入重定向符号(与固定命令搭配)

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

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

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

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

结束标记

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

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

[root@yunwei ~]# cat >>bo.txt<<EOF
> 123456
> EOF
[root@yunwei ~]# cat bo.txt 
shi
-bash: eco: 未找到命令
123456

3、通配符

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

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

二、正则表达式

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

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

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

1、符号概述

正则:regular expression RE

正则表达式 regular expression=regexp符号
基础正则BRE^ $ . * [] [^]
扩展正则ERE

2、基础正则

环境准备
cat >re.txt <<EOF
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese
chess!
my blog is http://oldboy.blog.51cto.com 
our size is http://blog.oldboyedu.com 
my qq is 49000448
not 4900000448.

my god ,i am not oldbey,but OLDBOY!
EOF
2.1、^ 以什么开头的行
[root@yunwei ~]# 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、$ 以什么结尾的行
[root@yunwei ~]# grep '8$' re.txt
my qq is 490000448
not 49000000448

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

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

[root@yunwei ~]# cat -A re.txt
I am oldboy teacher! $
I teach linux.$
$

那么^m$代表什么呢?

一行只有m

那么^$代表什么呢?

空行

[root@yunwei ~]# grep -n '^$' re.txt
3:
7:
10:
12:

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

grep -v '^$' /etc/ssh/sshd_config | grep -nv '^#'
2.3、. 任意一个字符,不匹配空行

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

[root@yunwei ~]# grep 'ba.l' re.txt 
I like badminton ball ,billiard ball and chinese chess!
2.4、\ 撬棍 转义字符、去掉特殊符号的含义.

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

grep '.$' re.txt
2.5、* 前一个字符连续出现 0 次或 0 次以上

在这里插入图片描述

2.6、 .* 所有,任意字符

.任意一个字符

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

.*表示所有.

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

[root@yunwei ~]# grep '^.*am' re.txt

在这里插入图片描述

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

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

在这里插入图片描述

2.7、 []表示匹配任意1个字符
grep '[abc]' re.txt

在这里插入图片描述

匹配数字

grep '[0-9]' re.txt

匹配小写字母

grep '[a-z]' re.txt

匹配大写字母

grep '[A-Z]' re.txt

字母匹配大小

grep '[a-zA-Z]' re.txt
grep '[a-Z]' re.txt

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

grep '^[mn]' re.txt

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

grep '[.!]$' re.txt

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

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

在这里插入图片描述

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

3、扩展正则

grep===egrep或 grep -E

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

awk默认支持扩展正则

#Linux三剑客如何支持扩展正则
#grep命令,推荐使用前2个.
egrep '0+' re.txt
grep -E '0+' re.txt
grep '0+' re.txt
#sed 需要使用-r选项 
#awk 直接支持扩展正则
3.1、+ 前一个字符连续出现1次或1次以上

取出连续出现的0

egrep '0+' re.txt

取出连续出现的数字

egrep '[0-9]+' re.txt

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

egrep -o'[a-Z]+' re.txt
3.2、 | 或者

文件中包含old或linux的行

egrep 'old|linux' re.txt

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

egrep -nv '^$|^#' /etc/ssh/sshd_config
3.3、()表示一个整体,用于后向引用(反向引用sed)

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

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的正则

[root@yunwei ~]# echo 10.0.0.{1..254} | xargs -n1 > ip.txt
[root@yunwei ~]# egrep '[0-9]{1,3}$' ip.txt

匹配身份证号的正则

地区: ([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次
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值