A-Shell-Knowledge
本文最后更新于 33 天前,如有失效请评论区留言。

Shell相关知识

模式匹配

模式(pattern)是用各种字符来匹配字符串的规则。

元字符

  • .是占位一个字符,字母、数字、空格、符号都可以,不能匹配换行符。比如a.b可以匹配a1b,a2b,a3b,a b等,但是不能匹配ab,a11b这样的字符。如果向匹配真正的小数点.,需要加反斜杠转义:\.
  • [字符列表]可以匹配中括号内任意一个字符,多选一。如t[xy]t可以匹配txttyt[0-9]、[a-z]可以匹配任意一位数字和任意一位小写英文字母。
  • [^ ]取反集合可以匹配任意一个不在括号内的字符,如[^0-9]匹配不是数字的字符,[^a-z]匹配不是小写英文字母的字符。

量词

量词修饰它紧贴着的前一个字符 / 分组,规定这个字符能连续出现几次。

  • *指可有可无
  • +指不能为空
  • ?指最多一次
    ab*指的是a后面的b可以没有,可以一个,可以一堆,可以匹配a,ab,abb,abbb,abbbb……
    ab+可以匹配ab,abb,abbb……,但是不能匹配a

锚点

锚点只标记位置,不会消耗文本里的字符,用来限定匹配出现在行首还是行尾。

  1. ^:行开头锚点
    ^hello:只有以 hello 开头的行才匹配,中间出现 hello 不算
  2. $:行结尾锚点
    txt$:只有行末尾是 txt 才匹配,行中间有 txt 不算

分组捕获

()圆括号括起来代表分组捕获。分组捕获可以:

  • 把一串字符打包成整体,量词可以修饰一整串内容;
  • 捕获分组:把括号里匹配到的字符串单独存起来,后续可以调取使用。
    例如:用括号打包 (ab)+,把 ab 当成一个整体,+ 作用于整块,要求 ab 连续重复至少 1 次:
    匹配:abababababab
    不匹配:aababb

反向引用

\ 代表反向引用
反向引用规则
第 1 组括号捕获内容 → \1 调用
第 2 组括号捕获内容 → \2 调用
例如:正则:(A)(B)(C)

  • \2 → B
  • \3 → C

常用系统命令

find

find 是 Linux/Unix 文件遍历查找命令,核心作用:递归扫描目录树,按照文件名、大小、时间、权限、归属者等条件筛选文件 / 文件夹,还能对匹配结果批量执行删除、复制、改权限等操作。
语法总框架是find [搜索起始路径] [筛选条件] [-exec/-delete/其他动作]

  • 搜索起始路径:不写就是默认.(当前目录);写/就是全盘扫描
  • 筛选条件:多条条件默认逻辑与同时生效
  • 后置动作:找到文件后要做什么操作,放整条命令最后

通过which find可以看到我们的find命令的位置是在/usr/bin/find.

  1. 按名称匹配
    -name精确或者模糊匹配
    通配符规则:
    *:任意长度任意字符
    ?:单个任意字符
    -iname忽略大小写匹配
    # 匹配 Test.txt、TEST.TXT、tEsT.txt 全部命中 find . -iname “test.txt”-not -path排除制定目录 # 查找所有txt文件,但不进入.git子目录 find . -name “.txt” -not -path “./.git/“`
  2. 按文件类型匹配
    -type
    f:普通文件(文本、压缩包、程序)
    d:目录/文件夹
    l:符号软链接
    b/c:块设备、字符设备(硬件设备文件)
  3. 按文件大小匹配
    -size
    单位:c字节、kKB、MMB、GGB
    符号规则:
    +n:大于 n
    -n:小于 n
    纯数字 n:严格等于 n
    # 大于100MB的文件 find /home -size +100M # 小于10KB的小文件 find . -size -10k # 0字节空文件 find . -size 0c
  4. 按时间匹配
    三种时间维度
    -mtime:内容修改时间(最常用,文件内容改动)
    -atime:访问时间(cat、vim 读取过)
    -ctime:属性变更时间(权限、所有者修改)
    单位:
    不带min:默认
    mmin:单位为分钟
    指定具体日期筛选 -newermt
    # 2026-06-01之后修改的所有文件 find . -newermt "2026-06-01"
  5. 多条件逻辑组合
    -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 次及以上
.*任意多个任意字符

实战正则示例

  1. 匹配以开头的行
grep "^第" test.txt
  1. 匹配第X讲,X 是多位数字(第 10 讲、第 100 讲也能匹配)
grep "第[0-9]\+讲" test.txt
  1. 精确匹配整行就是第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命令
  1. -c:count,统计匹配到的行数(你统计课程总讲数核心参数)
grep -c "第" test.txt # 输出 4,直接给出一共有多少讲
  1. -i:ignore 忽略大小写
grep -i "linux" test.txt # 能匹配到"Linux基础"
  1. -v:反向匹配,取反(输出不匹配的行)
grep -v "第" test.txt # 只输出不含课程的两行无关内容
  1. -o:只输出匹配到的片段,不输出整行
grep -o "第[0-9]\+讲" test.txt
  1. -n:显示行号
grep -n "第2讲" test.txt # 2:第2讲 curl使用
  1. -r / -R 递归遍历目录下所有文件
# 在当前目录所有文件里搜索
error grep -r "error" .
版权声明:除特殊说明,博客文章均为JiayiMu原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇