提高效率:Linux 正则表达式实用技巧

前言

在 Linux 系统中,正则表达式(Regular Expressions,简称 regex)是一个强大的工具,广泛应用于文本处理和数据筛选中。本文将结合实际讲解正则表达式的用法。(本文将以Ubuntu版本示例)

匹配符号

符号描述
.匹配任意单个字符(不包括换行符)
*匹配前面的字符0次或多次
^匹配行的开始位置
$匹配行的结束位置
[]匹配括号内的任意一个字符
[^]匹配括号内的人一个字符的反义
\转义字符,用于匹配特殊字符
[:alnum:]匹配字母和数字
[:alpha:]匹配任何英文大小写字符
[:lower:]匹配小写字母
[:upper:]匹配大写字母
[:blank:]匹配空格和制表符
[:space:]匹配各种类型的空白字符
[:punct:]匹配标点符号
匹配次数描述
*匹配前面的字符任意次
.*匹配任意长度的任意字符
\?匹配前面的字符0次或1次
\+匹配前面的字符最少1次
\{n\}匹配前面的字符n次
\{m,n}匹配前面的字符至少m次,至多n次
\{,n\}匹配前面的字符至多n次
\{n,\}匹配前面的字符至少n次

用法讲解

“.” 用法

// 过滤/etc/passwd文件中含有关键字的行
// ..代表两个任意字符,所以匹配的是r+两个任意字符+t
[root@ubuntu:~]$ grep "r..t" /etc/passwd
root:x:0:0:root:/root:/bin/bash

[] 用法

// 过滤/etc目录下含有关键字的目录文件
// [0-6]表示只匹配0-6之间的任意一个字符,所以匹配的是rc上+0-6任意一个字符
[root@ubuntu:~]$ ls /etc/ | grep 'rc[0-6]'
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
// rc[.0-6].匹配到的是rc+任意.或0-6任意字符+一个任意字符
[root@ubuntu:~]$ ls /etc/ | grep 'rc[.0-6].'
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.local
// 将最后那个点进行转义,代表需要匹配一个实际的 “.”
[root@ubuntu:~]$ ls /etc/ | grep 'rc[.0-6]\.'
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d

“*” 用法

// 匹配以r开头,0个或多个o,以t结尾的字符串
[root@ubuntu:/home]$ cat f5 |grep "ro*t"
**rt**  ract  raot  **rot**  roat  **rooot**

“.*” 用法

// 匹配以r开头一直延续到以t结尾的字符串
[root@ubuntu:~]$ head -3 /var/log/syslog |tail -1 |grep "r.*t"
2024-08-05T11:46:15.523135+00:00 ubuntu2401 ke**rnel: KERNEL support**ed cpus:

“?” 用法

// 匹配root或者或者root/
// \?是因为?是特殊字符所以需要/进行转义
[root@ubuntu:~]$ grep "root/\?" /etc/passwd
**root**:x:0:0:**root**:/**root**:/bin/bash
// 匹配以523147或者52314为结尾的字符串
[root@ubuntu:~]$ head -20 /var/log/syslog |tail -2 |grep ".*523147\?"
**2024-08-05T11:46:15.52314**6+00:00 ubuntu2401 kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
**2024-08-05T11:46:15.523147**+00:00 ubuntu2401 kernel: BIOS-e820: [mem 0x00000000fffe0000-0x00000000ffffffff] reserved

“+” 用法

// 匹配0x0开头,至少有一个f结尾的字符串
[root@ubuntu:~]$ head -20 /var/log/syslog |tail -2 |grep "0x0.*f\+"
2024-08-05T11:46:15.523146+00:00 ubuntu2401 kernel: BIOS-e820: [mem **0x00000000fee00000-0x00000000fee00fff**] reserved
2024-08-05T11:46:15.523147+00:00 ubuntu2401 kernel: BIOS-e820: [mem **0x00000000fffe0000-0x00000000ffffffff**] reserved

“\{n\}” 用法

// 匹配只有4个连续f的行
[root@ubuntu:~]$ head -20 /var/log/syslog | tail -11 | grep "[^f]f\{4\}]"
2024-08-05T11:46:15.523141+00:00 ubuntu2401 kernel: BIOS-e820: [mem 0x000000000009e800-0x00000000000**9ffff**] reserved
2024-08-05T11:46:15.523142+00:00 ubuntu2401 kernel: BIOS-e820: [mem 0x0000000000100000-0x000000007fe**dffff**] usable
2024-08-05T11:46:15.523146+00:00 ubuntu2401 kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec**0ffff**] reserved

\{m,n\} 用法

// 匹配2-4个f连续f的行
[root@ubuntu:~]$ head -20 /var/log/syslog | tail -11 | grep "[^f]f\{2,4\}]"
2024-08-05T11:46:15.523141+00:00 ubuntu2401 kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009e**7ff**] usable
2024-08-05T11:46:15.523141+00:00 ubuntu2401 kernel: BIOS-e820: [mem 0x000000000009e800-0x00000000000**9ffff**] reserved
2024-08-05T11:46:15.523142+00:00 ubuntu2401 kernel: BIOS-e820: [mem 0x0000000000100000-0x000000007fe**dffff**] usable
2024-08-05T11:46:15.523142+00:00 ubuntu2401 kernel: BIOS-e820: [mem 0x000000007fee0000-0x000000007fef**efff**] ACPI data
2024-08-05T11:46:15.523146+00:00 ubuntu2401 kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec**0ffff**] reserved
2024-08-05T11:46:15.523146+00:00 ubuntu2401 kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee0**0fff**] reserved
// 获取ip地址
[root@ubuntu:~]$ ifconfig ens33 | grep 'inet' | cut -d' ' -f10 | head -1
10.0.0.5

锚点符号

符号描述
^行首锚定, 用于模式的最左侧
$行尾锚定,用于模式的最右侧
^PATTERN$用于模式匹配整行
^$空行
^[[:space:]]*$空白行
\< 或 \b词首锚定,用于单词模式的左侧
\> 或 \b词尾锚定,用于单词模式的右侧
\<PATTERN\>匹配整个单词

“^” 用法

// 锁定#开头的行
[root@ubuntu:~]$  grep "^#" /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a

“$” 用法

// 锚定installation结尾的行
[root@ubuntu:~]$ grep "installation$" /etc/fstab
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin **installation**
# /boot was on /dev/sda2 during curtin **installation**

“^$” 用法

// 找出所有的非空行
[root@ubuntu:~]$  grep -v "^$" /etc/profile

或 | 用法

// 找出所有含error和warning的行
// -E是启用扩展正则表达式
[root@ubuntu:~]$ grep -E 'error|warning' /var/log/syslog
// 找出所有.txt和.md文件的行
// -E开启扩展正则表达式,$匹配行尾
[root@ubuntu:~]$ grep -E '\.(txt|md)$' filelist.txt
// 匹配多种日期格式的日志行
[root@ubuntu:~]$ grep -E '\d{4}-\d{2}-\d{2}|\d{2}/\d{2}/\d{4}' logfile.txt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值