shell语句:正则表达式

本文详细介绍了基础正则表达式和扩展正则表达式在grep和awk命令中的使用技巧,包括字符匹配、重复字符、分组和范围等,帮助读者理解如何高效地在文本文件中查找特定模式的行。

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

测试文本0519.txt的内容:

1. zhangsan 6y man
2. lisi 11y woman
3. wangwu 21y man
4. zhouwu 36y man
Faillure is the mother of success.
*********1024******


1. 基本正则表达式
正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式。
基础正则表达式是常用正则表达式最基础的部分。
在 Linux 系统中常见的文件处理工具中 grep 与 sed 支持基础正则表达式,而 egrep 与 awk 支持扩展正则表达式。

1.1 grep命令
1.1.1 查找特定字符
输出文件中包含woman字符串的行

grep 'woman' ./0519.txt

1.1.2 利用中括号“[]”来查找集合字
输出文件中包含gwu或uwu字符串的行,[gu]表示匹配g或者u

grep '[gu]wu' ./0519.txt

1.1.3 ^的的用法
^在[]中起反向选择的作用,在[]外面是以……开头的作用
输出匹配wu前不是u的行

grep '[^u]wu' ./0519.txt

输出以1.、2.或3.开头的行

grep '^[123].' ./0519.txt

输出行首不是以字母开头的行

grep '^[^a-zA-Z]' ./0519.txt

1.1.4 的 的 用 法 若 想 查 找 以 某 一 特 定 字 符 结 尾 的 行 则 可 以 使 用 “ 的的用法 若想查找以某一特定字符结尾的行则可以使用“ 使”定位符。例如,执行以下命令即可实现查询以小数点(.)结尾的行。因为小数点(.)在正则表达式中也是一个元字符,所以在这里需要用转义字符“\”将具有特殊意义的字符转化成普通字符
输出以.结尾的行

echo "the next day." | grep '\.$'

输出空白行
grep -n ‘^$’ 0519.txt

1.1.5 查找任意一个字符"."
输出以l开头i结尾的4个字符串的行

grep 'l..i' 0519.txt

1.1.6 元字符‘*’
输出至少包含一个1的的行

grep '11*' 0519.txt

输出以 z 开头 y 结尾,中间的字符可有可无的字符串

grep 'z.*y' 0519.txt

输出包含数字的行

grep '[0-9][0-9]*' 0519.txt

1.1.7 查找连续字符范围“{}”
因为“{}”在 Shell 中具有特殊意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符。“{}”字符的使用方法如下所示。
输出含连续2个c的行

grep 'c\{2\}' 0519.txt

输出含连续2个以上c的行

grep 'c\{2,\}' 0519.txt

输出含连续1~2个c的行

grep 'c\{1,2\}' 0519.txt

1.2 awk命令
awk基本用法参考shell语句:awk基本用法
这里补充说一下awk结合正则表达式的用法:
输出以1.开头的行

awk '$/^(1.)/{print $0}' 0519.txt

输出第2个字段为zhangsan的行

awk '$2~/^(zhangsan)/{print $0}' 0519.txt

1.3 元字符总结

元字符作用
^匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配“”字符本身,请使用“”
$匹配输入字符串的结尾位置。如果设置了RegExp 对象的 Multiline 属性,则“KaTeX parse error: Undefined control sequence: \n at position 6: ”也匹配‘\̲n̲’或‘\r’。要匹配“”字符本身,请使用“$”
\反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义
*匹配前面的子表达式零次或多次。要匹配“”字符,请使用“
.匹配除“\r\n”之外的任何单个字符
[]字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”
[^]赋值字符集合。匹配未包含的一个任意字符。例如,“[ ^abc ]可以匹配“plain”中任何一个字母
[n1-n2]赋值字符集合。匹配未包含的一个任意字符。例如,“[a-z]”可以匹配“plain”中任何一个字母
{n}赋值字符集合。匹配未包含的一个任意字符。例如,“[^abc]”可以匹配“plain”中任何一个字母
{n,}n 是一个非负整数,至少匹配 n 次。例如,“o\ {2,\ }”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o\ {1,\ }”等价于“o+”。“o\ {0,\ }”则等价于“o*”
{n,m}m 和 n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配m 次

图片:

2. 扩展正则表达式
2.1 扩展正则表达式概述:egrep命令
通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用范围更广的扩展正则表达式。
2.2 扩展
2.2.1 重复一个或者一个以上的前一个字符"+"
输出重一个或以上*的行

egrep '[*]+' 0519.txt

2.2.2 零个或者一个的前一个字符
输出包含oman或man字符串的行

egrep 'o?man' 0519.txt

2.2.3 使用或者(or)的方式找出多个字符
输出包含man或者woman的行

egrep 'man|woman' 0519.txt

2.3.4 ( ) 表示分组,(ab) 表示将ab当做一个整体去处理
输出123重复一次或以上的行

echo 'A123123Z' | egrep '(123)+'

2.3 正则表达式小结
grep命令大部分可以使用egrep实现
!!!特殊情况:
grep ‘o\ {2\ }’ /etc/passwd # 特殊符号需要用转义符\,不然无法识别
egrep ‘o{2}’ /etc/passwd # 用egrep命令,不需要转义符,{}表示前边字符的重复范围

3. 基本&扩展通用符号
不论在”基本正则表达式”中,还是在”扩展正则表达式”中,这些通用的符号所表达的意思都是相同的。
. 表示任意单个字符。
* 表示前面的字符连续出现任意次,包括0次。
.* 表示任意长度的任意字符,与通配符中的*的意思相同。
\ 表示转义符,当与正则表达式中的符号结合时表示符号本身。
[ ]表示匹配指定范围内的任意单个字符。
[^ ]表示匹配指定范围外的任意单个字符。

[[:alpha:]] 表示任意大小写字母。
[[:lower:]] 表示任意小写字母。
[[:upper:]] 表示任意大写字母。
[[:digit:]] 表示0到9之间的任意单个数字(包括0和9)。
[[:alnum:]] 表示任意数字或字母。
[[:space:]] 表示任意空白字符,包括"空格"、"tab键"等。
[[:punct:]] 表示任意标点符号。
[^[:alpha:]] 表示单个非字母字符。
[^[:lower:]] 表示单个非小写字母字符。
[^[:upper:]] 表示单个非大写字母字符。
[^[:digit:]] 表示单个非数字字符。
[^[:alnum:]] 表示单个非数字非字母字符。
[^[:space:]] 表示单个非空白字符。
[^[:punct:]] 表示单个非标点符号字符。
[0-9]与[[:digit:]]等效。
[a-z]与[[:lower:]]等效。
[A-Z]与[[:upper:]]等效。
[a-zA-Z]与[[:alpha:]]等效。
[a-zA-Z0-9]与[[:alnum:]]等效。
[^0-9]与[^[:digit:]]等效。
[^a-z]与[^[:lower:]]等效。
[^A-Z]与[^[:upper:]]等效
[^a-zA-Z]与[^[:alpha:]]等效
[^a-zA-Z0-9]与[^[:alnum:]]等效

^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。
$:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。
^$:表示匹配空行,这里所描述的空行表示"回车",而"空格"或"tab"等都不能算作此处所描述的空行。
^abc$:表示abc独占一行时,会被匹配到。
<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。
>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。
\B:匹配非单词边界,与\b正好相反。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值