首页 > 其他分享 >正则表达式

正则表达式

时间:2024-07-11 09:41:21浏览次数:6  
标签:opt grep 正则表达式 server Ansible txt root

正则表达式

Regular Express

【1】、三剑客与正则表达式

1、注意事项

  • 正则符号都是英文符号,避免使用中文符号
  • 推荐使用grep/egrep命令,默认设置了别名alias,自动加上颜色

【2】、符号概述

正则:regular expression (RE)

正则表达式regular expression 符号
基础正则BRE ^ $ . * .* [] [^]
扩展正则ERE | + () ? {}
其他类型正则(Perl语言类型正则)

【3】、基础正则

1、^ 以...开头

⚠️英文的符号

[root@Ansible-server /]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash

2、$ 以...结尾

[root@Ansible-server /]# grep 'nologin$' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

❓为什么我看着文件中有但是却过滤不出来

文件明明是以"o"结尾的,为什么却过滤不出来呢?

[root@Ansible-server opt]# cat a.txt 
123mnmmlo 
[root@Ansible-server opt]# grep 'o$' a.txt

我们可以使用cat -A去查看一下文件

[root@Ansible-server opt]# cat -A a.txt 
123mnmmlo $

我们会发现文件的结尾出现了一个“$”,并且还有一个空格,这又是什么呢?

这主要是由于cat -A他显示出了文件中隐藏的符号,$这个符号,在Linux中是一行结束的标志,每一行结束都要加一个$,只不过在我们日常查看时,他是处于隐藏状态的,我们看不到

从这也就可以说明为什么在正则表达式中要用“$”去表示以什么结尾。

从上面的代码中我们可以看到,$和正文之间还有一个空格,也就是说明,正文并不是以o结尾的,而是以空格结尾。至此我们也就知道为什么我们查不到以o结尾的数据了。

我们可以这样做,问题被解决

[root@Ansible-server opt]# grep ' $' a.txt 
123mnmmlo 

3、^$ 匹配空行

[root@Ansible-server opt]# grep -n '^$' a.txt 
2:

一般来说我们是不想看空行的

因此会把空行过滤出去grep -v,反向过滤

[root@Ansible-server opt]# grep -n -v '^$' a.txt 
1:123mnmmlo
4:afasg 

开生产环境中,我们一般会排除空行和#开头的行(注释行),这些会影响我们的观感

[root@Ansible-server opt]# grep  -v '^$' /etc/ssh/sshd_config | grep -v '^#'

4、. 任意一个字符

初学正则时,很少单独使用

不匹配空行

[root@Ansible-server opt]# grep -n . a.txt 
1:123mnmmlo
4:afasg 
  • grep -o:显示正则表达式匹配到了什么内容,以及正则表达式的匹配过程
  • image-20240430161652092

5、\撬棍

转义字符,去掉特殊符号的含义,让其表示原本的内容

通常和.使用搭配使用

例如:我们相匹配文件中所有以.结尾的行

如果我们直接使用.$,匹配到的是所有行,因此我们就需要将.的特殊含义去除

[root@Ansible-server opt]# grep -n '.$' a.txt 
1:123mnmmlo
3:af.
4:23452rtryret.
5:afasg 

[root@Ansible-server opt]# grep -n '\.$' a.txt 
3:af.
4:23452rtryret.

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

理解什么是连续/重复

111 数字1连续出现了3次

2222 数字2连续出现了4次

weqqrqq 英文字母连续出现了7次

12we 英文字母和数字连续出现了4次

这些都可以算是连续出现,而不是说只有出现相同的内容才算连续出现

❓我们去过滤“2*”,我们发现所有的都过滤出来了,这是为什么呢?

* 他可以匹配0次或0次以上的内容,那就可以解释为,不是2 的内容,我们就认为其是 2 出现了0次,因此也就满足要求,可以匹配出来

[root@Ansible-server opt]# grep -n '2*' a.txt 
1:123mnmmlo
2:
3:af.
4:23452rtryret.
5:112222fgh
6:2225564vvv
7:afasg 
8:222

7、.* 所有

使用频率特别高,表示所有,任何东西

  • .表示任意字符
  • *表示0次或0次以上匹配
  • .*表示匹配所有
[root@Ansible-server opt]# grep -n '^.*linux' a.txt 
5:I learn linux
6:I do not learn linux

贪婪匹配

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

他会一直去匹配a,直到最后一个

image-20240430165142163

8、[]匹配任意一个字符

[abc]:表示匹配a或者b或者c

匹配中括号中的任意一个字符

image-20240430165205434

⚠️[]会自动去掉特殊符号的特殊含义

9、[^]表示过滤除了中括号中的内容

[^abc]:表示过滤文件中除了abc之外的内容

[root@Ansible-server opt]# grep -n '[^a-z]' a.txt 
1:123mnmmlo
7:iaflknklanaaanubkbajo9878970akbjkhakj6797
8:222

【4】、扩展正则

  • grep不支持扩展正则的使用
  • egrep 支持扩展正则
  • sed 使用sed -r支持扩展正则
  • awk 默认支持扩展正则

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

  • 一般搭配着【】一起使用

  • 去除连续出现的2

    [root@Ansible-server opt]# grep '2+' a.txt 
    [root@Ansible-server opt]# egrep '2+' a.txt 
    123mnmmlo
    222
    
  • 连续出现的数字

    [root@Ansible-server opt]# egrep '[0-9]+' a.txt 
    123mnmmlo
    iaflknklanaaanubkbajo9878970akbjkhakj6797
    222
    
  • 连续出现的单词

    [root@Ansible-server opt]# egrep '[a-Z]+' a.txt 
    123mnmmlo
    iaflknklanaaanubkbajo9878970akbjkhakj6797
    [root@Ansible-server opt]# egrep -o '[a-Z]+' a.txt 
    mnmmlo
    iaflknklanaaanubkbajo
    akbjkhakj
    
  • 统计单词出现的次数

    [root@Ansible-server opt]# egrep -o '[a-Z]+' a.txt | sort | uniq -c
          1 akbjkhakj
          1 iaflknklanaaanubkbajo
          1 mnmmlo
    

2、| 或者

一般是过滤出含有单词1或者含有单词2的行

[root@Ansible-server opt]# egrep -n 'linux|apple' a.txt 
3:apple agsag  vv
4:linux wrathh apple

在/etc/services中过滤出:ssh或http或smtp

[root@Ansible-server opt]# egrep 'ssh|http|stmp' /etc/services

排除/etc/ssh/sshf_conf中的空行和注释行

[root@Ansible-server opt]# egrep -v -n '^$|^#' /etc/ssh/sshd_config

3、()表示一个整体,或者后向引用

()表示一个整体或者在sed中表示后向引用

[root@Ansible-server ~]# rpm -qa | egrep '^tree|^vim|^sl'
vim-enhanced-8.0.1763-19.el8_6.4.x86_64
vim-filesystem-8.0.1763-19.el8_6.4.noarch
vim-common-8.0.1763-19.el8_6.4.x86_64
tree-1.7.0-15.el8.x86_64
vim-minimal-8.0.1763-19.el8_6.4.x86_64
slang-2.3.2-3.el8.x86_64
slirp4netns-1.2.1-1.module+el8.9.0+19731+94cfa27e.x86_64
sl-5.02-1.el8.x86_64
# 表示一个整体
[root@Ansible-server ~]# rpm -qa | egrep '^(tree|vim|sl)'
vim-enhanced-8.0.1763-19.el8_6.4.x86_64
vim-filesystem-8.0.1763-19.el8_6.4.noarch
vim-common-8.0.1763-19.el8_6.4.x86_64
tree-1.7.0-15.el8.x86_64
vim-minimal-8.0.1763-19.el8_6.4.x86_64
slang-2.3.2-3.el8.x86_64
slirp4netns-1.2.1-1.module+el8.9.0+19731+94cfa27e.x86_64
sl-5.02-1.el8.x86_64

4、{}

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

image-20240505162603616

image-20240505162701800``

## 匹配身份证
[root@Ansible-server opt]# egrep '[0-9]{17}[0-9X]$' a.txt

5、?

表示前一个字符出现0或1次

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

image-20240505164615091

6、\b

单词边界

[root@moudle01 19:27:51  ~]# grep "the" abc 
the apple
I like the apple
these apple
hello tomthe
[root@moudle01 19:27:56  ~]# egrep "\bthe\b" abc 
the apple
I like the apple

7、扩展正则小结

扩展正则 含义
+⭐⭐⭐⭐⭐ 前一个字符连续出现一次或者多次
|⭐⭐⭐⭐⭐ 或者
()⭐⭐

标签:opt,grep,正则表达式,server,Ansible,txt,root
From: https://www.cnblogs.com/xuruizhao/p/18295434

相关文章

  • Spark SQL中的正则表达式应用
    正则表达式是一种强大的文本处理工具,在SparkSQL中也得到了广泛支持。本文将介绍SparkSQL中使用正则表达式的主要方法和常见场景。目录1.正则表达式函数1.1regexp_extract1.2regexp_replace1.3regexp_like2.在WHERE子句中使用正则表达式3.在GROUPBY中使用正......
  • 精通Postman响应解析:正则表达式的实战应用
    ......
  • 正则表达式详解
    1.正则表达式的作用(1)文本搜索和匹配:可以用来搜索、匹配和替换特定模式的文本。          比如,查找所有符合特定格式的邮箱地址、电话号码等。(2)数据验证:可以用来验证用户输入是否符合特定的格式要求。     比如,验证电子邮件地址、密码复杂度等。(3)数据......
  • 正则表达式
    声明:此随笔内容转载自廖雪峰官方网站,仅供自我学习,无任何商业目的,如侵权,请告知。字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻......
  • 正则表达式
    通用正则表达式:正则表达式:可以用在限制用户输入的范围、长度,也可以在搜寻时给定一个指定的范围和长度。您正在编写应用程序,并且您希望在用户选择用户名时设置规则。我们希望用户名可以包含字母,数字,下划线和连字符。为了让它看起来不丑,我们还想限制用户名中的字符数量。应用......
  • 生信算法9 - 正则表达式匹配氨基酸序列、核型和字符串
    建议在Jupyter实践。1.使用正则表达式匹配指定的氨基酸序列importre#氨基酸序列seq='VSVLTMFRYAGWLDRLYMLVGTQLAAIIHGVALPLMMLI'#正则表达式匹配match=re.search(r'[A|G]W',seq)#打印match及匹配到开始位置和结束位置print(match)#<re.Matchobject;......
  • 常用正则表达式
    字符\:特殊字符、转义字符^:正则表达式的开始$:正则表达式的结束*:等于{0,},即0到多+:等于{1,},即1到多?:等于{0,1},即0到1{n}:匹配确定的次数,n次{n,}:匹配大于n的次数,等于n*{n,m}:匹配大于n,小于m的次数.:匹配除“\n”之外的任何单个字符。\d:匹......
  • 正则表达式
    正则模式^表达式$^从整个字符串开头的地方匹配$从整个字符串的结尾开始匹配模糊匹配.匹配任意字符,除了换行符*重复匹配*号前面0个或多个的表达式。?重复匹配?号前面0个或1个由前面的正则表达式定义的片段,非贪婪方式(?写在数量词的之后)+重复匹配+号前面1个或多......
  • 常用正则表达式
    一、校验数字的表达式 1数字:^[0-9]*$ 2n位的数字:^\d{n}$ 3至少n位的数字:^\d{n,}$ 4m-n位的数字:^\d{m,n}$ 5零和非零开头的数字:^(0|[1-9][0-9]*)$ 6非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 7带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,......
  • 正则表达式
    正则表达式目录正则表达式一、正则表达式的概述1、概念2、作用3、可达到的目的二、基础正则1、字符匹配元字符1.2、实例1.2.1.(匹配任意单个字符)1.2.2[](匹配指定范围内的任意单个字符)1.2.3[^]匹配指定范围外的任意单个字符2、表示次数的元字符2.1实例2.1.1*2.1.2.*2......