0正则表达式
正则表达式是用来匹配字符串的,针对文本内容的文本过滤工具里所使用的
例如 grep sed awk等等
通配符: 针对文件名称
正则表达式: 针对文本内容
基本正则表达式
- 字符匹配
. : 匹配任意单个字符
[] : 匹配指定范围内任意单个字符
[^] : 匹配指定范围外任意单个字符 :###^非
[:alnum:]: 字母和数字字符
[:alhpa:]: 字母
[:ascii:]: ASCII码
[:digit:]: 数字字符
[:lower:]: 小写字母
[:blank:]:空格或制表符
[:cntrl:]:ASCII控制字符
[:digit:]:数字
[:graph:]:非控制、非空格字符
[:lower:]:小写字母
[:print:]:可打印字符
[:punct:]:标点符号字符
[:space:]:空白字符,包括垂直制表符
[:upper:]:大写字母
[:xdigit:]:十六进制数字
核心: 匹配次数

正则表达式 - 图1
正则表达式 - 图2
* : 匹配前面的字符任意次数
.* : 匹配任意长度的字符
\? : 匹配前面的字符0或1次
+ : 匹配前面的字符至少1次
{m} : 匹配前面的字符m次
{m,n} : 匹配前面的字符至少m次,最大n次
{0,n}: 匹配前面的字符至多n次
{m,}: 匹配前面的字符至少m次

- 位置锚定
^:行首锚定,用于模式的最左侧
$: 行尾锚定,用于模式的最右侧
^PATTERN$ :用于模式匹配整行内容
^$ : 匹配空行
\b | \< : 词首锚定,用于单词模式的左侧
\b | > : 词尾锚定,用于单词模式的右侧
\ : 匹配整个单词
#
# /etc/fstab
# Created by anaconda on Wed Feb 5 10:47:08 2020
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=f0bd0552-b73f-48cb-aef2-1a1ca6bdc06f /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0

1. 匹配空行: ^$
[root@test tmp]# grep “^$” 11.txt
2. 匹配以#开头的行 : ^#
image.png
[root@test tmp]# grep “^#” 11.txt
3. 匹配包含数字的行: [1-9] 或者[[:digit:]] 数字字符
[root@test tmp]# grep “[1-9]+“ 11.txt #+匹配前面的字符至少一次,即全部匹配
grep命令:文本过滤工具
grep [reg] object

- 分组

  1. **\(gp\) 将一个或多个字符捆绑在一起;当作一个字符**<br />** \(xy\)*ab --> 文本中xy出现任意次数和ab字符 **<br /> [root@test tmp]# grep "\(xy\)*ab" 12.txt <br /> [root@test tmp]# grep "\(xy\)\+ab" 12.txt <br /> **Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部变量中,**<br />** 这些变量存储在 \1 \2 \3 .... 并且可以在本次正则中进行引用**<br />** **<br />** \1 从最左侧起,第一个括号中匹配到的内容**<br />** **<br />** \(ab\+\(xy\)\)**<br />** **<br />** \1: ab\+\(xy\) \表示结束符号 不影响**<br />** \2: xy **<br />** **<br />**扩展****的正则表达式:**<br />**- 字符匹配**<br />**- 次数匹配**<br />** * : 匹配前面的字符任意次数 **<br />** .* : 匹配****任意长度的字符**<br />** ? : 匹配前面的字符01次**<br />** + : 匹配前面的字符至少1次,即全部匹配 **<br />** {m} : 匹配前面的字符m **<br />** {m,n} : 匹配前面的字符至少m次,最大n **<br />** {0,n}: 匹配前****面****的字符至多n次**<br />** {m,}: 匹配前面的字符至少****m **<br />**位置锚定:**<br />** ^:行首锚定,用于模式的最左侧**<br />** $: 行尾锚定,用于模式的最右侧**<br />** ^PATTERN$ :用于模式匹配整行内容**<br />** ^$ : 匹配空行**<br />** \b | < : 词首锚定,用于单词模式的左侧**<br />** \b | > : 词尾锚定,用于单词模式的右侧**<br />** <PATTERN> : 匹配整个单词**<br /> <br />- (gp) 将一个或多个字符捆绑在一起;当作一个字符<br /> (xy)*ab --> 文本中xy出现任意次数和ab字符 <br /> Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部变量中,<br /> 这些变量存储在 \1 \2 \3 .... 并且可以在本次正则中进行引用<br /> <br /> \1 从最左侧起,第一个括号中匹配到的内容<br /> <br /> (ab+(xy))<br /> <br /> \1: ab+(xy)<br /> \2: xy <br /> <br /> <br />1.显示/proc/meminfo文件中以大小s开头的行(2种方式)<br />reg ^[Ss]<br />grep "^[Ss]" /proc/meminfo<br />grep -i "^s" /proc/meminfo #-i参数表示忽略大小写<br /> 2.显示/etc/passwd文件中不以/bin/bash结尾的行 (位置锚定)<br />reg: /bin/bash$ <br />grep -v "/bin/bash$" /etc/passwd #$位置锚定<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/787585/1581241568383-0a1e417d-9503-417f-8087-520593ee1aba.png#align=left&display=inline&height=173&name=image.png&originHeight=244&originWidth=496&size=30369&status=done&style=none&width=352)<br />4.如果root用户存在,显示其默认的shell程序<br />id root > /dev/null && grep "^root\" /etc/passwd | cut -d: -f7<br />**5.找出/etc/passwd中的两位或三位数**<br />**![image.png](https://cdn.nlark.com/yuque/0/2020/png/787585/1581246848185-a7a2a7ff-809f-4b46-90b8-7dd05093b8f8.png#align=left&display=inline&height=83&name=image.png&originHeight=99&originWidth=687&size=38244&status=done&style=none&width=577)**<br />**正则表达式: [[:digit:]\{2,3\}] #\{m,n\} : 匹配前面的字符至少m次,最大n次 正则表达式是直接连接的**<br />**<br />**6.显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符行**<br />**grep "^[[:space:]]\+[^[:space:]]\+" /etc/grub2.cfg #\+匹配前面的字符至少一次<br />**<br />**7.找出“netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行**<br /> netstat -tan | grep "LISTEN[[:space:]]*$"

8.添加用户bash、testbash以及nologin(其shell为/sbin/nologin),然后找出/etc/passwd文件中用户名同shell名的行
useradd bash && useradd testbash && useradd nologin -s /sbin/nologin
/???什么意思
9.显示/etc/passwd文件中ID号最大用户的用户名
**sort -t: -k3 -n /etc/passwd | cut -d: -f 1 | tail -1

sort:
-t<分隔字符> 指定排序时所用的栏位分隔字符。
-k选择以哪个区间进行排序。
-n依照数值的大小排序。
cut:
-d自定义分隔符,默认为制表符。
-f与-d一起使用,指定显示哪个区域。
tail:
-n 显示行数
sort匹配

  • -b 忽略每行前面开始出的空格字符。
  • -c 检查文件是否已经按照顺序排序。
  • -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
  • -f 排序时,将小写字母视为大写字母。
  • -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
  • -m 将几个排序好的文件进行合并。
  • -M 将前面3个字母依照月份的缩写进行排序。
  • -n 依照数值的大小排序。
  • -u 意味着是唯一的(unique),输出的结果是去完重了的。
  • -o<输出文件> 将排序后的结果存入指定的文件。
  • -r 以相反的顺序来排序。
  • -t<分隔字符> 指定排序时所用的栏位分隔字符。
  • +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
  • —help 显示帮助。
  • —version 显示版本信息。

[root@test tmp]# sort -t: -k3 -n /etc/passwd | tail -1 | grep -o “^[[:alnum:]]+>“
grep -o :只输出有re的字符串 正则表达式,后面接上正则表达式,[:alnum:]:字母和数字字符
-t指定分隔符号 ,-k表示指定什么区间进行排序,-n按照数值的大小进行排序,以字母数字开头并且至少匹配一次
tail命令:

  • -f 循环读取
  • -q 不显示处理信息
  • -v 显示详细的处理信息
  • -c<数目> 显示的字节数
  • -n<行数> 显示文件的尾部 n 行内容
  • —pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
  • -q, —quiet, —silent 从不输出给出文件名的首部
  • -s, —sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒

tail -l:????
nologin
image.png
10、[root@test tmp]# cat /etc/fstab | grep -Ev “^#|^$”
将所查看的文件中的空行和以#开头的行过滤掉** |表示或者的意思**
其中,grep -E 可以理解成 egrep
而egrep是grep的扩展,支持更多的re元字符
而egrep和grep -v参的功能是一样的,只是前者支持更多的re元字符