• linux正则表达式
    • 一、linux文本查找命令
    • 二、正则表达式介绍
      • 基本正则表达式元字符
    • 三、拓展正则表达式
    • 实例 1 正则表达式
    • 实例 2 :扩展正则表达式

在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的。
(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。(下一篇Linux文件查找就是在介绍命令:find)
(2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。

linux正则表达式

grep : 最早的文本匹配程序,基本正则表达式(BRE)来匹配文本。
egrep : 扩展式grep,其使用扩展式正规表达式(ERE)来匹配文本。
fgrep : 快速grep,这个版本匹配固定字符串而非正则表达式。(不支持正则表达式搜索)

一、linux文本查找命令

对grep命令的介绍作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行 模式:由正则表达式字符及文本字符所编写的过滤条件 grep 命令语法:grep [选项] (参数)选项:grep --color=auto :对匹配到的文本着色显示(CentOS7里默认显示)grep -v     #   反向搜索grep -i    #   忽略大小写grep -n   #   显示匹配的行号grep -c    #   统计匹配的行数,不显示搜索结果grep -o   #   仅显示匹配到的字符串grep -q   #   静默 (不显示结果)echo $?      # 显示命令执行结果,正确为0,错误不为0grep -A   #     显示搜索行及其向下相邻的#行grep -B   #   显示搜索行及其向上相邻的#行grep -C   #     显示搜索行及其向上下相邻的#行grep -e    #     支持多个选项间grep -e ‘root’ -e ‘bin’ /etc/passwd  #多个选项间or关系grep -w     #     匹配整个单词grep -E     #   或egrep 支持扩展正则表达式grep -F     #   或fgrep 不支持扩展正则表达式

二、正则表达式介绍

正则表达式(REGEXP):由一类特殊字符及文本字符所编写的模式,其中有 些字符(元字符)不表示字符字面意义,而表示控制或通配 的功能
程序支持:grep,sed,awk,vim, less,nginx,varnish等 分两类: 基本正则表达式:BRE 扩展正则表达式:ERE grep -E, egrep
正则表达式引擎: 采用不同算法,检查处理正则表达式的软件模块 PCRE(Perl Compatible Regular Expressions)
元字符分类:字符匹配、匹配次数、位置锚定、分组
man  7 regex

基本正则表达式元字符

字符匹配:.   匹配任意单个字符 ( ) : 匹配方括号括起来的正则表达式群[]  匹配指定范围内的任意单个字符,其中可用连字符(-)指的连续字符的范围 [^] 匹配指定范围外的任意单个字符 [:alnum:] 字母和数字 [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z [:lower:] 小写字母 [:upper:] 大写字母 [:blank:] 空白字符(空格和制表符) [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广) [:cntrl:] 不可打印的控制字符(退格、删除、警铃...) [:digit:] 十进制数字 [:xdigit:]十六进制数字 [:graph:] 可打印的非空白字符 [:print:] 可打印字符 [:punct:] 标点符号匹配次数: 用在要指定次数的字符后面,用于指定前面的字 符要出现的次数 * 匹配前面的字符任意次,包括0次 (贪婪模式:尽可能长的匹配 ).* 任意长度的任意字符\ 通常用于打开或关闭后续字符的特殊含义 \| 或者( 匹配|符号前或后的正则表达式)\? 匹配其前面的字符0或1次 \+ 匹配其前面的字符至少1次 \{n\} 匹配前面的字符n次 \{m,n\} 匹配前面的字符至少m次,至多n次 \{,n\} 匹配前面的字符至多n次 \{n,\} 匹配前面的字符至少n次位置锚定:定位出现的位置^ 行首锚定,用于模式的最左侧 $ 行尾锚定,用于模式的最右侧 ^PATTERN$  用于模式匹配整行^$  空行 ^[[:space:]]*$  空白行 \< 或 \b 词首锚定,用于单词模式的左侧 \> 或 \b 词尾锚定;用于单词模式的右侧 \<PATTERN\> 匹配整个单词分组
() 分组
后向引用:\1, \2, ...
| 或者
a|b         #a或b
C|cat       #C或cat
(C|c)at     #Cat或cat分组:() 将一个或多个字符捆绑在一起,当作一个整体进 行处理,如:(root)\+  分组括号中的模式匹配到的内容会被正则表达式引擎记录于 内部的变量中,这些变量的命名方式为: \1, \2, \3, ... \1 表示从左侧起第一个左括号以及与之匹配右括号之间的 模式所匹配到的字符 示例: \(string1\+\(string2\)*\) \1 :string1\+\(string2\)* \2 :string2
后向引用:引用前面的分组括号中的模式所匹配字符,而非 模式本身
或者:| 示例:a|b: a或b              C|cat: C或cat            (C|c)at:Cat或cat

三、拓展正则表达式

     egrep = grep -E egrep [OPTIONS] PATTERN [FILE...]扩展正则表达式的元字符: 字符匹配:. 任意单个字符 [] 指定范围的字符 [^] 不在指定范围的字符次数匹配:*:匹配前面字符任意次 ?: 0或1次 +:1次或多次 {m}:匹配m次 {m,n}:至少m,至多n次位置锚定:^  :行首 $  :行尾\<, \b :语首 \>, \b :语尾 分组() 后向引用:\1, \2, ... 或者:a|b: a或b                          C|cat: C或cat                (C|c)at:Cat或cat

(实例操作使用CentOS7.4版本做的,可能会与6的系统有出入)

实例 1 正则表达式

1、显示/proc/meminfo文件中以大小s开头的行(两种方法)

方法1 grep -i "^s" /proc/meminfo
[root@centos7 ~]# grep -i "^s" /proc/meminfo #-i 忽略大小写 ^行首锚定"s"参数
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 9260 kB
Slab: 74036 kB
SReclaimable: 28260 kB
SUnreclaim: 45776 kB方法2 grep "^[S\|s]" /proc/meminfo
[root@centos7 ~]# grep "^[S\|s]" /proc/meminfo # ^行首锚定"[S\|s]"S或s
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 9260 kB
Slab: 74036 kB
SReclaimable: 28260 kB
SUnreclaim: 45776 kB

2、显示/etc/passwd文件中不以/bin/bash结尾的行

[root@centos7 ~]# grep -v "/bin/bash\$" /etc/passwd # -v 反向搜索 "\(bin/bash\)$"以bin/bash结尾的行(因输出结果只去了一部分)
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

3、显示用户rpc默认的shell程序

[root@centos7 ~]# cat /etc/passwd |grep "^\(rpc\)\b" |cut -d: -f 7 # grep "^(rpc)\b" 取出以用户rpc开头的行\b可以换成\>(后边不再做说明) ,cut -d: -f 7 以:做分隔符取第七列
/sbin/nologin

4、找出/etc/passwd中的两位或三位数

root@centos7 ~]# grep -o "\b[0-9]\{2,3\}\b" /etc/passwd #(输出值太多只取一部分)
12
11
12

5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行

[root@centos7 ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg #^[[:space:]]\+以一个以上空白开头的[^[:space:]]且后边为非空白的行(输出值太多只取一部分)
load_env
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
set default="${saved_entry}"
menuentry_id_option="--id"
menuentry_id_option=""
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=

6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行

[root@centos7 ~]# netstat -tan |grep "LISTEN[[:space:]]\*$" #[[:space:]]+$以一个以上空白结尾且前边为‘LISTEN’
tcp 0 0 0.0.0.0:111 0.0.0.0: *LISTENtcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0: *LISTENtcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0: *LISTENtcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN
tcp6 0 0 :::111 ::: *LISTENtcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:631 ::: *LISTENtcp6 0 0 ::1:25 :::* LISTEN
tcp6 0 0 ::1:6010 :::* LISTEN

7、显示CentOS7上所有系统用户的用户名和UID

[root@centos7 ~]# cat /etc/passwd |cut -d: -f1,3 |grep "\b[0-9]\{1,3\}\b" #先把用户和UID竖列利用cut命令切出来,再执行grep命令取出UID(系统用户UID小于1000,CentOS7以前的版本小于500)(输出值太多只取一部分)
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
mail:8
operator:11
games:12
ftp:14
nobody:99
systemd-network:192

8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出"/etc/passwd"用户名同"shell"名的行

[root@centos7 ~]# useradd sh #创建用户sh
[root@centos7 ~]# useradd bash #创建用户bash
[root@centos7 ~]# useradd testbash #创建用户testbash
[root@centos7 ~]# useradd -s /sbin/nologin nologin 创建用户nologin同时设置shell为/shin/nologin
''' [root@centos7 ~]# cat /etc/passwd |grep "^\(.*\)\b.*/\1$" ''' #利用分组^段落开头(.*)用小括号引起来为后项引用里边的.*为任意字符\b词尾锚定.*中间任意字符,/\1$ 中/目录分割符\1$段落结尾引用前项用小括号引起的部分(分组引用的是命令结果而非命令本身)
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
nologin:x:1003:1003::/home/nologin:/sbin/nologin
bash:x:1005:1005::/home/bash:/bin/bash

9、利用df和grep,取出磁盘各分区利用率,并从大到小排序

[root@centos7 ~]# df |grep -o "[0-9]\{1,3\}%" | sort -rn #"[0-9]\{1,3\}%" 硬盘的利用率为百分之最多100%所以取三位数,后边加%以表示是百分数。
70%
18%
1%
1%
1%
0%
0%
0%

实例 2 :扩展正则表达式

1、显示三个用户root、mage、wang的UID和默认shell

方法一:扩展正则表达式也可以用标准正则表达式[root@centos7 ~]# egrep -e^"mage" -e^"wang" -e"^root" /etc/passwd |cut -d: -f 3,7 #方法一利用的是grep多选项搜索-e区分链接选项用标准正则表达式也可以
0:/bin/bash
1001:/bin/bash
1002:/bin/bash方法二:扩展正则表达式[root@centos7 ~]# egrep "^(mage|wang|root)\>" /etc/passwd |cut -d: -f 3,7 #方法二利用或"|"扩展正则表达式。
0:/bin/bash
1001:/bin/bash
1002:/bin/bash方法3:标准正则表达式[root@centos7 ~]# grep "^\(mage|wang|root)\>" /etc/passwd|cut -d: -f 3,7 #方法二利用或"|"标准正则表达式。
0:/bin/bash
1001:/bin/bash
1002:/bin/bash

2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

[root@centos6 q]# egrep "^[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions #行首锚定,下划线"_"、字母或数字一次以上,后边跟小括号"()"
fstab_decode_str() {
checkpid() {
**readlink() {**fgrep() {
__kill_pids_term_kill_checkpids() {
echo_success() {
echo_failure() {
echo_passed() {
echo_warning() {
update_boot_stage() {
success() {
failure() {

3、使用egrep取出/etc/rc.d/init.d/functions中其基名

基名为文件名或目录最后一字符串

[root@centos7 ~]# echo /etc/rc.d/init.d/functions |egrep -o "[^/]+/?$" #-o仅显示匹配到的字符串,"[^/]+"行首非以一个以上/字符开头,"/?$"零或一个"/"结尾的字符(目录是以/来做分割的)
functions

4、使用egrep取出上面路径的目录名

[root@centos7 ~]# echo /etc/rc.d/init.d/functions |egrep -o "/.*/\<" #-o仅显示匹配到的字符串,"/.*/\<" 以"/"开始的任意字符以"/"结尾,"\<"词首锚定表示后边还有字符串。(目录是以/来做分割的)
/etc/rc.d/init.d/[root@centos6 q]# echo /etc/rc.d/init.d/functions | egrep -o ".*/." |egrep -o ".*/" #-o仅显示匹配到的字符串,以任意字符开头且为"/"结尾的字符串,重复操作两次。
/etc/rc.d/init.d/

5、统计last命令中以root登录的每个主机IP地址登录次数

[root@centos7 ~]# last # last输出结果
root pts/0 192.168.217.1 Sat Jan 20 23:25 still logged in
root pts/1 192.168.217.1 Sat Jan 20 19:28 - 22:10 (02:42)
root pts/0 192.168.217.1 Sat Jan 20 16:27 - 22:11 (05:43)
reboot system boot 3.10.0-693.el7.x Sat Jan 20 16:26 - 02:06 (09:40)
root pts/1 192.168.217.1 Sat Jan 20 03:12 - 05:35 (02:22)[root@centos7 ~]# last |egrep "^root\b" |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" |uniq -c #做两次搜索,"^root\b"行首以root开头(词尾锚定)-o仅显示匹配到的字符串"([0-9]{1,3}\.){3}[0-9]{1,3}"0-9重复1到3次表示三位数.表示IP地址分割符()小括号括起来表示一个整体,再重复3次IP地址前三位就有了,最后[0-9]{1,3}表示最后一位IP地址。
5 192.168.217.1
1 172.18.251.157
1 192.168.217.1
1 172.18.251.157

6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255

[0-9]
[1-9][0-9]
1[0-9][0-9]
2[0-4][0-9]
25[0-5]
\#[0-9]表示0-9,[1-9][0-9]1-9和0-9组和起来就是10-99,1[0-9][0-9]第一位是1已经确定23位都是0-9组和起来就是100-199,2[0-4][0-9]第一位确定是2第二位是0-4第三位是0-9组和起来就是200-249,250-255第一位和第二位确定下来是25第三位是0-5组和起来就是250-255

7、显示ifconfig命令结果中所有IPv4地址

[root@centos7 ~]# ifconfig |egrep -o "\b(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9]{2} |1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b" #上两题的结合,IP地址最大255.
172.18.250.135
255.255.0.0
172.18.255.255
192.168.217.131
255.255.255.0
192.168.217.255
127.0.0.1
255.0.0.0
192.168.122.1
255.255.255.0
192.168.122.255[root@centos7 ~]# ifconfig |egrep netmask |tr -s ' ' : |cut -d: -f3 #这个是只取IP地址没有掩码和网管,先搜出netmask三行在做分割
172.18.250.135
192.168.217.131
127.0.0.1
192.168.122.1

8、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面

[root@centos7 ~]# echo welcome to magedu linux |grep -o . |sort |uniq -c |sort -rn #先用"grep -o ."点表示任意单个字符,-o把匹配到的单个字符成竖列排列出来,排序,去重,再排序。
3 e
3
2 u
2 o
2 m
2 l
1 x
1 w
1 t
1 n
1 i
1 g
1 d
1 c
1 a

9、显示/run/media/root/CentOS 7 x86_64/Packages/目录下的rpm包的.格式架构(.x86_64.rpm中.rpm前一部分)并查重复数量

取出一部分的结果
zlib-devel-1.2.7-17.el7.x86_64.rpm
zlib-static-1.2.7-17.el7.i686.rpm
zlib-static-1.2.7-17.el7.x86_64.rpm方法1:利用拓展正则表示式
[root@centos7 Packages]# ls *.rpm |egrep -o "\.[[:alnum:]_]+\.rpm$" |cut -d. -f2 |sort|uniq -c #ls先选出以.rpm结尾的rpm包再用egrep显示以点开头后边跟字母、数字或下划线的任意个字符,以.rpm结尾的字符串,剪切、排序、去重。
2141 i686
3076 noarch
4374 x86_64方法2: 不用正则表达式
[root@centos7 Packages]# ls *.rpm |rev|cut -d. -f2|rev|sort|uniq -c #显示以.rpm结尾的rpm包,“rev”左右翻转,剪切再翻转。排序、去重。
2141 i686
3076 noarch
4374 x86_64

Linux正则表达式 --已整理相关推荐

  1. linux 注释批处理,Linux_批处理 正则表达式(findstr) 整理,语法 findstr [/b] [/e] [/l] [/r] [/s] - phpStudy...

    批处理 正则表达式(findstr) 整理 语法 findstr [/b] [/e] [/l] [/r] [/s] [/i] [/x] [/v] [/n] [/m] [/o] [/p] [/offli ...

  2. linux正则表达式_Linux 中几个正则表达式的用法

    公众号关注"杰哥的IT之旅",选择"星标",重磅干货,第一时间送达! 链接:https://www.linuxmi.com/linux-zhengzebiaod ...

  3. Linux 常用命令整理(Centos7) (时区/正则/sed/htop/screen/ln/awk/……)

    目录 Linux 常用命令整理(Centos7) (附加正则.时区.git等) 一.系统查询常用命令: 1.文件中空格制表符替换sed 2.查看宿主机的用户名密码 3.last .w.lastb 查看 ...

  4. Linux常用指令整理

    Linux常用命令整理 快捷键 [Tab] [Tab] 接在一串指令的第一个字的后面,则为"命令补全": [Tab] 接在一串指令的第二个字以后时,则为"文件补齐&quo ...

  5. linux常用命令整理分类

    linux常用命令整理分类 快捷入口 命令帮助指令 开机关机指令 linux 文件权限 linux 文件操作 linux 文件内容查阅 指令和文件的搜索 文件系统 压缩文件 Shell script ...

  6. Linux正则表达式grep与egrep

    grep -io "http:/=[A-Z0-9]\{16\}" ./wsxf.txt >wsxf_urls.txt Linux正则表达式grep与egrep 正则表达式:它 ...

  7. JS正则表达式大全(整理详细且实用)

    JS正则表达式大全(整理详细且实用) 作者: 字体:[增加 减小] 类型:转载 时间:2013-11-14 我要评论 JS正则表达式大全(整理详细且实用).需要的朋友可以过来参考下,希望对大家有所帮助 ...

  8. linux最简单的命令,Linux 简单命令整理

    Linux系统是一种开源高稳定性的操作系统,在服务器领域得到广泛的应用.作为一个Java后台开发工程师经常需要登录Linux服务器部署应用程序,或者是查看程序的运行状态.一般的Linux服务器上是不会 ...

  9. Linux正则表达式多个条件并,linux 正则表达式深度解析

    简介 大体来讲,正则表达式的文法分为3种标准:BRE.ERE 和 ARE.其中 BER 和 ERE 属于 POSIX 标准,ARE 则是由各家定义的扩展. POSIX 正则表达式 传统上,POSIX ...

最新文章

  1. ext2_inode
  2. Silverlight 游戏开发小技巧:轨迹跟随效果
  3. 接口自动化-发送get请求-1
  4. python装饰器作用和功能_python装饰器大详解
  5. js基础教程学习笔记
  6. 一个类似京东商城那种多条件筛选效果
  7. python期货自动交易_3自动交易模块_python量化交易_Python视频-51CTO学院
  8. 预装WIN8的电脑是GPT分区模式,无法安装WIN7
  9. Mongodb主从模式SECONDARY提升为PRIMARY
  10. oracle rac告警,oracle11.2.0.4 RAC 日志总有告警
  11. 区块链重塑经济与世界
  12. 如何pull gcr上的镜像
  13. 3年级计算机的知识能力,三年级信息技术教案资料三篇
  14. 【CP2K教程(二)】WO3的投影态密度和能带结构
  15. 最新双色球彩万宝缩水使用方法大全
  16. 用Vue写的一个简易的待办事项清单系统
  17. 如何查找下载外文文献,超强外文文献检索网站排名
  18. Fisherface(FLD)人脸识别实验
  19. hadoop启动命令 start-all.sh提示Permission denied问题解决
  20. python:写个简陋的按键精灵

热门文章

  1. 中国静电放电(ESD)抑制器行业发展状况与供需前景预测报告2022-2027
  2. 2022年外贸营第一篇文章
  3. web基础漏洞之SQL注入漏洞
  4. 访问服务器sqlserver数据库文件夹,服务器的sql数据库在哪个文件夹
  5. sourcetree 卡顿_监控摄像头画面卡顿?离不开这五大原因
  6. 用STATECAD快速设计有限状态机
  7. 新机驾到 选oppo reno 7还是荣耀60?
  8. 不要因为网络劫持而泄露手机号码
  9. vim复制和粘贴一整行和复制多行
  10. 连续降税、人民币结算,巴西潜力爆发!开发细节见内!