Linux 系统中正则表达式的使用

1、什么是正则表达式

英文为:regexp
详细信息查看:man 7 regex
支持的程序:grep,sed,awk,vim, less,nginx,varnish等
类别:基本正则表达式: BRE 扩展正则表达式: ERE
用处:用于匹配或检测想要的内容。

2、字符规则

字符匹配:
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
[: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\>匹配整个单词

分组: () 将一个或多个字符捆绑在一起,当作一个整体进 行处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于 内部的变量中,这些变量的命名方式为:\1, \2, \3, …
示例: \(string1\+\(string2\)*\) \1
string1\+\(string2\)* \2 : string2
后向引用:引用前面的分组括号中的模式所匹配字符, 而非模式本身
或者\ | 示例:a \ |b: a或b C\ |cat: C或cat \(C\ |c\)at:Cat或cat

用法示例

1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
grep ^S\ |^s /proc/meminfo
grep -i ^s /proc/meninfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行
grep -v "/bin/bash$" /etc/passwd
3、显示用户rpc默认的shell程序
grep "^rpc\>" /etc/passwd | cut -d : -f7
grep -w "^rpc" /etc/passwd | cut -d : -f7

4、找出/etc/passwd中的两位或三位数
cat /etc/passwd |grep -o "\<[0-9]\{2,3\}\>"

5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
cat /etc/grub2.cfg |grep "^[[:space:]]\+[^[:space:]]"

6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
netstat -tan|grep "\<LISTEN\>[[:space:]]*$"

7、显示CentOS7上所有系统用户的用户名和UID
cat /etc/passwd |cut -d: -f1,3 |grep "\<[[:digit:]]\{1,3\}\>"$

8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名同shell名的行
cat /etc/passwd | grep "\(^.*\)\>.*\/\1$"

9、仅利用df和grep和sort,取出磁盘各分区利用率,并从大到小排序
df |grep ^/dev/sd |grep -o "\b[[:digit:]]\{1,3\}\b%"|sort -rn

留给大家的linux学习者的练习

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

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

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

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

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

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

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

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

答案

  1. cat /etc/passwd|grep -E "^(root|wang|mage)\>"|cut -d : -f3,7
    cat /etc/passwd|grep -E -w "^(root|wang|mage)"|cut -d : -f3,7
  2. cat /etc/rc.d/init.d/functions |egrep "^.*\(\)"
  3. echo /etc/rc.d/init.d/functions |egrep -o "[^/]+$"
  4. echo /etc/rc.d/init.d/functions |egrep -o "[/]*.+/"
  5. last|grep root|grep -v tty|tr -s ' '|cut -d' ' -f3|grep -v ^:|sort|uniq -c
  6. [0-9]
    [1-0][0-9]
    1[0-9][0-9]
    2[0-4][0-9]
    25[0-5]
  7. ifconfig |grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"
  8. echo "welcome to magedu linux"|egrep -o "[[:alpha:]]"|sort|uniq -c|sort -r|tr -s ' '|cut -d' ' -f3|paste -s -d' '
<think>好的,用户想了解Linux中正表达式的语法和使用教程。首先,我需要整理一下正则表达式的基本概念,然后分点讲解语法元素,比如元字符、字符类、量词等。根据提供的引用内容,特别是引用[2]和[3],可以提取出一些关键点,比如特殊字符的使用,如^、$、.、*等,以及如何用grep命令进行匹配。 用户可能需要基础语法的示例,比如行首行尾的匹配,字符类的用法,还有量词如*、+、{}的差异。同时,需要区分基本正则表达式(BRE)和扩展正则表达式(ERE),这在引用中提到的grep -E和egrep有关联。另外,引用[3]中的例子展示了排除特定行的操作,可以作为一个实用案例。 还要注意用户可能对正则表达式和通配符的区别有疑问,虽然用户的问题中没有直接提到,但引用[1]提到了两者的区别,可能需要简单带过。过用户当前的问题集中在正则表达式上,所以重点还是语法和使用。 接下来,我需要确保回答结构清晰,分点列出语法,每个部分给出例子,并标注引用来源。例如,在讲行首行尾匹配时,引用[3]中的例子用了$符号,可以引用[^3]。同时,使用教程部分需要给出实际命令示例,比如用grep进行搜索,并解释每个参数的作用,如引用[3]中的-v参数。 最后,生成的相关问题需要围绕正则表达式的进阶用法、与工具的结合使用以及常见错误,这样用户如果有进一步疑问可以自行探索。需要检查是否符合用户要求的格式,比如使用中文,数学公式正确,引用标识正确放置,以及相关问题部分的存在。</think>### Linux正则表达式语法详解 Linux正则表达式是文本处理的核心工具,其语法分为**基础正则表达式(BRE)**和**扩展正则表达式(ERE)**两种标准[^2]。以下是核心语法规则与使用场景: --- #### 一、基础语法规则 1. **行首与行尾匹配** - `^` 匹配行首,如 `^abc` 匹配以 `abc` 开头的行。 - `$` 匹配行尾,如 `xyz$` 匹配以 `xyz` 结尾的行。 2. **单个字符匹配** - `.` 匹配任意单个字符(除换行符),如 `a.c` 可匹配 `abc`、`a1c` 等。 - `[]` 定义字符集合,如 `[aeiou]` 匹配任意元音字母,`[0-9]` 匹配数字。 3. **量词(重复次数)** - `*` 匹配前一个字符0次或多次,如 `go*gle` 匹配 `ggle`、`gogle`、`gooogle` 等。 - `+`(ERE支持)匹配前一个字符1次或多次,如 `go+gle` 排除 `ggle`。 - `{n,m}`(ERE支持)匹配前一个字符n到m次,如 `a{2,4}` 匹配 `aa`、`aaa`、`aaaa`。 4. **转义字符** - 使用 `\` 转义特殊字符,如 `\$` 匹配字面量 `$`,`\.` 匹配字面量 `.`[^2]。 --- #### 二、扩展正则表达式(ERE)语法 ERE支持更简洁的语法,需配合 `grep -E` 或 `egrep` 使用: - `|` 表示逻辑或,如 `apple|banana` 匹配包含 `apple` 或 `banana` 的行。 - `()` 分组表达式,如 `(abc)+` 匹配连续多次的 `abc`。 --- #### 三、实用命令示例 1. **查找包含数字的行** ```bash grep '[0-9]' filename ``` 2. **排除特定内容** ```bash grep -v '/bin/bash$' /etc/passwd # 排除以/bin/bash结尾的行[^3] ``` 3. **匹配IP地址** ```bash grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' logfile ``` --- #### 四、与通配符的区别 正则表达式用于文本匹配(如 `grep`、`sed`),而通配符(如 `*`、`?`)用于文件名扩展(如 `ls *.txt`)[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值