本文最后更新于 33 天前,如有失效请评论区留言。
Shell相关知识
模式匹配
模式(pattern)是用各种字符来匹配字符串的规则。
元字符
.是占位一个字符,字母、数字、空格、符号都可以,不能匹配换行符。比如a.b可以匹配a1b,a2b,a3b,a b等,但是不能匹配ab,a11b这样的字符。如果向匹配真正的小数点.,需要加反斜杠转义:\.。[字符列表]可以匹配中括号内任意一个字符,多选一。如t[xy]t可以匹配txt和tyt,[0-9]、[a-z]可以匹配任意一位数字和任意一位小写英文字母。[^ ]取反集合可以匹配任意一个不在括号内的字符,如[^0-9]匹配不是数字的字符,[^a-z]匹配不是小写英文字母的字符。
量词
量词修饰它紧贴着的前一个字符 / 分组,规定这个字符能连续出现几次。
*指可有可无+指不能为空?指最多一次
如ab*指的是a后面的b可以没有,可以一个,可以一堆,可以匹配a,ab,abb,abbb,abbbb……。ab+可以匹配ab,abb,abbb……,但是不能匹配a。
锚点
锚点只标记位置,不会消耗文本里的字符,用来限定匹配出现在行首还是行尾。
^:行开头锚点^hello:只有以 hello 开头的行才匹配,中间出现 hello 不算$:行结尾锚点txt$:只有行末尾是 txt 才匹配,行中间有 txt 不算
分组捕获
()圆括号括起来代表分组捕获。分组捕获可以:
- 把一串字符打包成整体,量词可以修饰一整串内容;
- 捕获分组:把括号里匹配到的字符串单独存起来,后续可以调取使用。
例如:用括号打包(ab)+,把ab当成一个整体,+作用于整块,要求ab连续重复至少 1 次:
匹配:ab、abab、ababab
不匹配:aab、abb
反向引用
\ 代表反向引用
反向引用规则
第 1 组括号捕获内容 → \1 调用
第 2 组括号捕获内容 → \2 调用
例如:正则:(A)(B)(C)
\2→ B\3→ C
常用系统命令
find
find 是 Linux/Unix 文件遍历查找命令,核心作用:递归扫描目录树,按照文件名、大小、时间、权限、归属者等条件筛选文件 / 文件夹,还能对匹配结果批量执行删除、复制、改权限等操作。
语法总框架是find [搜索起始路径] [筛选条件] [-exec/-delete/其他动作]
- 搜索起始路径:不写就是默认
.(当前目录);写/就是全盘扫描 - 筛选条件:多条条件默认逻辑与同时生效
- 后置动作:找到文件后要做什么操作,放整条命令最后
通过which find可以看到我们的find命令的位置是在/usr/bin/find.
- 按名称匹配
-name精确或者模糊匹配
通配符规则:*:任意长度任意字符?:单个任意字符-iname忽略大小写匹配# 匹配 Test.txt、TEST.TXT、tEsT.txt 全部命中find . -iname “test.txt”-not -path排除制定目录# 查找所有txt文件,但不进入.git子目录 find . -name “.txt” -not -path “./.git/“` - 按文件类型匹配
-type
f:普通文件(文本、压缩包、程序)
d:目录/文件夹
l:符号软链接
b/c:块设备、字符设备(硬件设备文件) - 按文件大小匹配
-size
单位:c字节、kKB、MMB、GGB
符号规则:+n:大于 n-n:小于 n
纯数字 n:严格等于 n# 大于100MB的文件 find /home -size +100M # 小于10KB的小文件 find . -size -10k # 0字节空文件 find . -size 0c - 按时间匹配
三种时间维度-mtime:内容修改时间(最常用,文件内容改动)-atime:访问时间(cat、vim 读取过)-ctime:属性变更时间(权限、所有者修改)
单位:
不带min:默认天
带mmin:单位为分钟
指定具体日期筛选-newermt# 2026-06-01之后修改的所有文件 find . -newermt "2026-06-01" - 多条件逻辑组合
-a:逻辑「与」,多条条件同时满足,默认省略就是 – a-o:逻辑「或」,满足任意一条即可!/-not:逻辑「非」,取反# 并且:log后缀 + 大于10MB find . -name "*.log" -size +10M # 或者:txt 或者 log 文件 find . -name "*.txt" -o -name "*.log" # 非:排除.git目录 find . ! -path "./.git/*"找到文件后执行动作
delete直接删除匹配文件-ls长格式列出详情,等价ls -l-exec批量执行自定义命令- 语法:
-exec 命令 {} \;{}:占位符,代表每一个匹配到的文件\;:语句结束标记,必须转义分号
- 语法:
grep
全称:Global regular expression print
全称:全局正则表达式打印
作用:逐行扫描文本,用字符串 / 正则表达式匹配内容,只输出匹配到的行;
两种使用语法
# 用法1:直接读取文件
grep [选项] "匹配内容" 文件名
# 用法2:接收管道输入
命令 | grep [选项] "匹配内容"
grep正则
grep 默认支持基础正则,扩展正则建议加 -E。
| 符号 | 含义 |
|---|---|
^ | 行开头 |
$ | 行结尾 |
[0-9] | 任意单个数字 |
[a-z] | 小写字母 |
+ | 前面字符出现 1 次及以上 |
.* | 任意多个任意字符 |
实战正则示例
- 匹配以
第开头的行
grep "^第" test.txt
- 匹配
第X讲,X 是多位数字(第 10 讲、第 100 讲也能匹配)
grep "第[0-9]\+讲" test.txt
- 精确匹配整行就是
第3讲 grep详解
grep "^第3讲 grep详解$" test.txt
扩展正则 -E(不用转义加号)
# 等价上面,写法更清爽
grep -E "第[0-9]+讲" test.txt
常用拓展
准备测试文本 test.txt
第1讲 Linux基础
第2讲 curl使用
第3讲 grep详解
12345
hello world
第4讲 find命令
-c:count,统计匹配到的行数(你统计课程总讲数核心参数)
grep -c "第" test.txt # 输出 4,直接给出一共有多少讲
-i:ignore 忽略大小写
grep -i "linux" test.txt # 能匹配到"Linux基础"
-v:反向匹配,取反(输出不匹配的行)
grep -v "第" test.txt # 只输出不含课程的两行无关内容
-o:只输出匹配到的片段,不输出整行
grep -o "第[0-9]\+讲" test.txt
-n:显示行号
grep -n "第2讲" test.txt # 2:第2讲 curl使用
-r / -R递归遍历目录下所有文件
# 在当前目录所有文件里搜索
error grep -r "error" .