正则表达式,grep/egrep

本文详细介绍了正则表达式的使用方法,并结合grep命令展示了如何检索和替换文本中的特定模式。通过具体实例,读者可以学习如何利用正则表达式进行高效的数据筛选。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则表达式

正则表达式时通常被用来检索和替换那些符合摸个模式的文本内容。它是用单个字符串来描述或替换那些符合某个模式的文本内容

grep

命令:grep
命令格式:grep [选项] ‘word’ filename
选项:
-c :打印符合要求的行数
-n :输出符合要求的行及其行号
-i :表示忽略掉大小写
-v :打印不符合要求的行
-r :遍历所有的目录
-A:后接数字,打印符合要求的行及下面数字行(-A2 ,打印符合要求的行及下面的两行)
-B:后接数字,打印符合要求的行及上面数字行(-B2 ,打印符合要求的行及上面的两行)
-C :后接数字,打印符合要求的行及上下面数字行(-B2 ,打印符合要求的行及上下边的两行)

过滤某个关键词及行号:

[root@shuai-01 grep]# grep -n 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

某个关键词所在的行数:

[root@shuai-01 grep]# grep -c 'root' passwd
2

过滤不带某个关键词的行:

[root@shuai-01 grep]# grep -nv 'nologin' passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
22:shuai:x:1000:1000::/home/shuai:/bin/bash
23:user1:x:1001:1001::/home/user1:/bin/bash
24:user2:x:1003:1005::/home/user5:/bin/bash

打印符合要求的行及下两行:

[root@shuai-01 grep]# grep -A2 'root' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/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

打印符合要求上两行:

[root@shuai-01 grep]# grep -B2 'root' passwd
root:x:0:0:root:/root:/bin/bash
--
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

打印符合要求行及上下两行:

[root@shuai-01 grep]# grep -C2 'root' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
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

正则表达式

在正则表达式中,“^”表示行的开始,
$表示行的结尾,

空行可以用“^$”表示。而中括号”[]”,如[0-9]表示数字0到9,[a-z] 表示字母a到z, [^0-9] 表示不是数字。要是^[^0-9] 表示不是以数字0到9做开头。
一个写正则博客,写的很好:
https://my.oschina.net/u/3497124/blog/1137725

几个正则表达式和grep结合的用法

打印有数字的行:

[root@shuai-01 grep]# grep '[0-9]' inittab 
11111111111111
2222222222&33333333333
!2332423434
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5

打印没有数字的行:

[root@shuai-01 grep]# grep -v '[0-9]' inittab 
# inittab is no longer used when using systemd.shadh
shkdjfaldbacjlasdkfnkjsadnc#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

打印不以#号开头的行及行号:

[root@shuai-01 grep]# grep -nv '^#' inittab 
2:shkdjfaldbacjlasdkfnkjsadnc#
6:shaonfdjnsjchb
7:akjdhbjkhac
8:ssskjk;lmkldkajsfcipanjkn
9::adljfcajadksh,c
10:11111111111111
11:2222222222&33333333333
12:!2332423434
13::wq
14:

打印不以字母开头的行:

[root@shuai-01 grep]# grep -v '^[a-zA-Z]' inittab 
# inittab is no longer used when using systemd.shadh
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
:adljfcajadksh,c
11111111111111
2222222222&33333333333
!2332423434
:wq

[root@shuai-01 grep]# grep '^[^a-zA-Z]' inittab 
# inittab is no longer used when using systemd.shadh
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
:adljfcajadksh,c
11111111111111
2222222222&33333333333
!2332423434
:wq

在正则表达式中:
“ . ”表示任意一个字符
“ * ”表示零个或多个前面的字符。如:’i*’ 表示零个或多个i
“ .* ”表示零个或多个任意字符
“ {} ”内部为数字,表示前面字符重复的次数。如:’g{2}’表示g重复两次。’g{1,3}’ 表示g重复两到三次
“ + ”表示一次或多次前面的字符。如’i+’ 表示一个或多个i
“ ? ”表示零个或一个?前面的字符
“ | ”表示或者的意思 。如’aaa|iii’表示aaa或者iii

过滤r和o中有一个任意的字符:

[root@shuai-01 grep]# grep 'r.o' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

‘*’和‘+’比较:‘ii+’表示 ii ,iii , i……
‘ii*’表示i,ii,iii ,i….
这个你要将特殊字符和前面的一个字符看成一个整体,i(i+),i(i*)

[root@shuai-01 grep]# egrep 'i+' 1.txt
i
ii
[root@shuai-01 grep]# egrep 'i*' 1.txt
i
ii
gr

指定要过滤的次数:o要过滤两次

[root@shuai-01 grep]# grep 'o\{2\}' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

[root@shuai-01 grep]# grep -E 'o{2}' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

[root@shuai-01 grep]# egrep 'o{2}' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

过滤字符串1或者2:‘root|nologin’

[root@shuai-01 grep]# egrep 'root|nologin' passwd
root:x:0:0:root:/root:/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
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
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin

shell中特殊字符于正则特殊字符对比:

shell中:
‘*’表示零个或多个任意字符
‘?’表示一个任意字符
正则中:
‘*’表示零个或多个前面字符
‘+’表示一个或多个前面字符
‘?’表示零个或一个前面字符
‘.’任意一个字符

<think>嗯,用户的问题是关于Linux正则表达式中斜杠的意义和用法。首先,我需要明确用户已经了解正则表达式的基础,但可能对斜杠的具体使用有疑问。根据用户提供的引用资料,特别是引用3到5,其中提到了grep正则表达式的不同标准和转义字符的使用。 首先,我要区分正斜杠(/)和反斜杠(\)在Linux中的不同作用。正斜杠通常用于路径分隔符,而反斜杠在正则表达式中作为转义字符。比如,引用3指出,在grep中使用+号时需要加反斜杠,而中括号不需要。这说明反斜杠用于转义特殊字符,使其被正确解释。 接下来,用户可能想知道斜杠在正则表达式中的具体应用场景。例如,在sed或awk中,正斜杠用作模式分隔符,比如s/pattern/replacement/。这时候正斜杠是语法的一部分,而不是正则表达式本身的内容。而反斜杠则用于转义特殊字符,如\.表示匹配字面意义的点号。 还要注意不同正则表达式标准的区别,比如基本正则表达式(BRE)和扩展正则表达式(ERE)。在BRE中,某些元字符如+、?需要转义,而ERE中则不需要。例如,grep默认使用BRE,所以要用\+来匹配一个或多个,而grep -E则可以直接用+。 用户可能混淆路径中的斜杠和正则中的斜杠,需要明确两者的不同。例如,路径使用正斜杠,而正则中转义用反斜杠。引用1和2提到Windows和Linux路径的区别,但用户的问题集中在正则表达式,所以重点应放在转义和语法上。 还要考虑实际例子,比如如何匹配URL中的斜杠,或者如何转义特殊字符。例如,匹配路径/home/user需要写成\/home\/user,但实际在正则中可能不需要,除非在特定的上下文中,比如sed替换命令的分隔符。 总结,需要分点解释正斜杠和反斜杠的不同用途,结合实例说明在正则表达式中的转义和语法,以及不同工具(grep、sed、awk)之间的差异。同时,引用提供的资料来支持解释,确保回答准确可靠。</think>### Linux正则表达式中斜杠的详细解析 在Linux正则表达式中,斜杠的用法需要区分**正斜杠**($/$)和**反斜杠**($\backslash$),它们在不同场景下有明确分工。 --- #### 一、正斜杠($/$)的用途 1. **路径分隔符** Linux系统使用正斜杠作为文件路径分隔符,例如: $$/home/user/Documents/example.txt$$ 这与Windows的反斜杠路径(如$C:\Program Files$)形成对比[^1][^2]。 2. **正则表达式中的语法标记** 在某些工具(如`sed`、`awk`)中,正斜杠用于界定正则表达式模式: ```bash sed 's/pattern/replacement/' file.txt # 替换操作的分隔符 ``` 这里的正斜杠是语法的一部分,而非正则表达式的内容。 --- #### 二、反斜杠($\backslash$)的用途 1. **转义特殊字符** 反斜杠用于转义正则表达式中的元字符(如`*`、`+`、`?`、`.`),使其匹配字面值: - 匹配`.`字符:`\.`(否则`.`表示任意字符) - 匹配`+`字符:`\+`(否则`+`表示重复前一个字符1次或多次) ```bash grep 'a\+b' file.txt # 匹配"a+b"中的字面量+号 ``` 2. **支持扩展正则表达式(ERE)** 使用`grep -E`或`egrep`时,某些元字符(如`+`、`?`)无需转义: ```bash grep -E 'a+b' file.txt # 直接匹配1个或多个a后接b ``` 但若在基础正则表达式(BRE)中,仍需转义:`a\+b`[^3][^5]。 3. **预定义字符类** 反斜杠用于定义特殊字符类: - `\d`:数字(需工具支持,如`grep -P`) - `\s`:空白字符 --- #### 三、实际应用示例 1. **匹配URL路径** ```bash grep 'https://example\.com/path/' access.log # 转义.和匹配字面/ ``` 2. **替换文件路径** ```bash sed 's/\/old\/path/\/new\/path/' config.conf # 转义正斜杠作为路径分隔符 ``` 3. **提取带特殊符号的内容** ```bash grep 'price: \$[0-9]\+' products.txt # 匹配"price: $100" ``` --- #### 四、常见误区 1. **混淆路径和正则表达式** - 路径使用正斜杠(`/home/user`),正则表达式中的斜杠需根据上下文处理。 - 在`sed`替换命令中,若路径含正斜杠,可改用其他分隔符(如`|`): ```bash sed 's|/old/path|/new/path|' file.txt ``` 2. **不同工具的标准差异** | 工具 | 正则表达式类型 | 是否需要转义`+` | |------------|----------------|------------------| | `grep` | BRE | 是(`\+`) | | `grep -E` | ERE | 否 | | `grep -P` | PCRE | 否 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值