首页 > 运维 > linux运维 > 正文

Linux 命令 | 每日一学,文本处理三剑客之grep命令实践

爱谁谁
发布: 2025-06-26 10:16:15
原创
772人浏览过

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]


0x00 前言简述上一篇,我们学习了Shell脚本编程中的正则表达式【Linux 运维 | 6.从零开始,Shell编程中正则表达式 RegExp 速成指南】,不知道各位初学者是否已经初步掌握了呢?接下来我们将学习Linux中的文本处理三剑客之一grep命令。grep 命令是Linux系统中常用的文本搜索工具,它可以根据指定的字符串模式或者正则表达式对文件内容进行逐行搜索、匹配等操作。

Linux 命令 | 每日一学,文本处理三剑客之grep命令实践不管是哪一门编程语言,字符串类型都是极其重要的,因此在学习各种编程语言后会发现近40%左右都与字符串有关,特别是在php、java编程,当然在Linux中的shell脚本开发也同样存在,所以这也是我们必须要学习并掌握 grep 命令的原因。

此 Linux 命令 | 系列 文章将作为《#运维从业必学》专栏的辅助学习知识,这是每位Linux运维工程师必须掌握的基础知识,作者耗费心力、时间进行总结,希望对大家有所帮助,所以若有帮助还请多多关注作者,并鼓励作者创造更多实践文章吧。

废话不多说,实践为王!


0x01 grep 命令 & egrep 命令grep(Global search Regular Expression and Print out the line,全面搜索正则表达式并打印出行)是一种强大的文本搜索工具,它能使用基础正则表达式(Base Regular Expression)搜索文本,根据用户指定的模式对目标文件进行逐行匹配,并把匹配的行打印出来。

egrep(Extended Global search Regular Expression and Print out the line)是 grep 命令的扩展版本,它支持扩展正则表达式(Extended Regular Expression)语法,相当于 grep -E 命令。

温馨提示:这里作者将 grep 命令与 egrep 命令放在一起进行讲解,由于 egrep 使用的语法及参数与 grep 命令相同,所以不分开进行讲解了,若有不同的地方后续作者也会标注出来!

语法参数

用法: grep [选项]... 模式 [文件]...
# 模式选择与解释:
  -E, --extended-regexp      是扩展正则表达式  [常用]
  -F, --fixed-strings        是字符串
  -G, --basic-regexp         是基本正则表达式   [常用]
  -P, --perl-regexp          是 Perl 正则表达式 [常用]
  -e, --regexp=       用指定的字符串来进行匹配操作  [常用]
  -f, --file=         从给定中取得
  -i, --ignore-case         在模式和数据中忽略大小写 [常用]
      --no-ignore-case      不要忽略大小写(默认)
  -w, --word-regexp         强制仅完全匹配字词 [常用]
  -x, --line-regexp         强制仅完全匹配整行
  -z, --null-data           数据行以一个 0 字节结束,而非换行符
# 杂项:
  -s, --no-messages         不显示错误信息
  -v, --invert-match        选中不匹配的行,即反向匹配 [常用]
  -V, --version             显示版本信息并退出
# 输出控制:
  -m, --max-count=    得到给定次匹配后停止
  -b, --byte-offset         输出的同时打印字节偏移
  -n, --line-number         输出的同时打印行号  [常用]
      --line-buffered       每行输出后刷新输出缓冲区
  -H, --with-filename       为输出行打印文件名  [常用]
  -h, --no-filename         输出时不显示文件名前缀
      --label=        将给定作为标准输入文件名前缀
  -o, --only-matching       只显示行中非空匹配部分  [常用]
  -q, --quiet, --silent     不显示所有常规输出  [常用]
      --binary-files=TYPE   设定二进制文件的 TYPE(类型);TYPE 可以是 'binary'、'text' 或 'without-match'
  -a, --text                等同于 --binary-files=text
  -I                        等同于 --binary-files=without-match
  -d, --directories=ACTION  how to handle directories; ACTION is 'read', 'recurse', or 'skip'
  -D, --devices=ACTION      如何处理设备、FIFO和socket;操作为“读取”或“跳过”
  -r, --recursive           like --directories=recurse [常用]
  -R, --dereference-recursive 递归搜索目录,但不搜索符号链接
      --include=GLOB        只查找匹配 GLOB 的文件   [常用]
      --exclude=GLOB        跳过匹配 GLOB 的文件     [常用]
      --exclude-from=FILE   跳过所有匹配给定文件内容中任意模式的文件 [常用]
      --exclude-dir=GLOB    跳过所有匹配 GLOB 的目录 [常用]
  -L, --files-without-match 仅打印没有选定行的文件名
  -l, --files-with-matches  仅打印选定行的文件名
  -c, --count               打印出匹配的行总数 [常用]
  -T, --initial-tab         make tabs line up (if needed)
  -Z, --null                在FILE名称后打印0字节
文件控制:
  -B, --before-context=NUM  打印文本及其前面 NUM 行  [常用]
  -A, --after-context=NUM   打印文本及其后面 NUM 行  [常用]
  -C, --context=NUM         打印文本匹配的前后 NUM 行  [常用]
  -NUM                      same as --context=NUM
      --group-separator=SEP use SEP as a group separator
      --no-group-separator  use empty string as a group separator
      --color[=WHEN],      --colour[=WHEN]       使用标记突出显示匹配的字符串参数 'always', 'never', or 'auto'
  -U, --binary              EOL时不删除CR字符(MSDOS/Windows)
登录后复制

基础示例

# 示例文本
tee learn_grep.txt  six.txt  # 1 2 3 4 5 6
seq 5 8 > eight.txt # 5 6 7 8
grep -f eight.txt  six.txt   # 只有 5 和 6 重叠  5   6
# 或者
cat eight.txt six.txt | sort | uniq -d  5  6
登录后复制

Linux 命令 | 每日一学,文本处理三剑客之grep命令实践weiyigeek.top-grep递归查询命令示例

实践示例

# 1.静默验证当前系统是否为Ubuntu、CentOS或Rocky Linux系统
grep -Eqi -e "Ubuntu|CentOS|Rocky" /etc/system-release
echo $?
# 静默验证当前bash是否为sh,不显示错误信息
ps -p $$ | grep -siq sh
echo $?
# 2.使用正则表达式匹配不带注释以及空白的行,不过为了兼容性建议都加上 -E 参数
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"
# 或者使用 -Ev 选项
grep -Ev "^$|#" /etc/ssh/sshd_config
grep -Ev "^($|#)" /etc/ssh/sshd_config
  Include /etc/ssh/sshd_config.d/*.conf
  Port 22
  PermitRootLogin yes
  AuthorizedKeysFile   .ssh/authorized_keys
  PrintLastLog no
  Subsystem   sftp    /usr/libexec/openssh/sftp-server
# 3.使用递归搜索的方式,按照文件类型搜索,或者按照文件里的文件名进程排除匹配
# 只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}
# 在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"
# 在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist.txt
# 4.使用0值字节后缀,并批量删除匹配到的文件
# 测试文件:
echo "aaa" > f1.txt   echo "bbb" > f2.txt
echo "aaa" > f3.txt  # f1 和 f3 内容相同
grep "aaa" f* -Z  # file1aaa  # file3aaa
grep -lZ "aaa" f*   # f1.txtf3.txt
# 命令解释:执行后会删除f1和f3,grep 输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。
grep -lZ "aaa" f* | xargs -0 rm
# 5.打印出匹配文本之前或者之后的行,使用 seq 命令生成10个数字。
# 使用 -A 显示匹配某个结果之后的行,seq 10 | grep "5" -A 3 -n  # 5:5  # 6-6  # 7-7  # 8-8
# 显示匹配某个结果之前的2行,使用 -B 选项:
seq 10 | grep "5" -B 2 -n  # 3-3  # 4-4  # 5:5
# 显示匹配某个结果的前1行和后1行,使用 -C 选项:
seq 10 | grep "5" -C 1 -n  # 4-4  # 5:5  # 6-6
# 显示 以 Cached 打头所在行的下三行
grep -E -A 3 "^Cached" /proc/meminfo  # Cached:           396196 kB  # SwapCached:            0 kB  # Active:           218416 kB  # Inactive:         447312 kB
grep -E -A 3 "^Cached" meminfo  #显示后三行
# SwapCached:            0 kB
# Active:           163624 kB
# Inactive:         319796 kB
登录后复制

Linux 命令 | 每日一学,文本处理三剑客之grep命令实践weiyigeek.top-grep-ABC输出匹配字符的前后行

正则表达式匹配示例

# 示例1.grep采用perl正则表达式元字符(环视功能)需指定参数-P
# 当后接字符串可以匹配出则显示,否则不显示
echo "WeiyiWeiyiGeek Whoami" | grep -oP "Weiyi(?=WeiyiGeek)" # 当前置字符串可以匹配出则显示,否则不显示
echo "WeiyiGeek Whoami" | grep -oP "(?=WeiyiGeek)Weiyi"  # Weiyi
# 示例2.只输出匹配的perl正则元字符字符串
grep -Po '(?
登录后复制

Linux 命令 | 每日一学,文本处理三剑客之grep命令实践weiyigeek.top-egrep命令扩展表达式案例

问题.find命令与grep命令的区别

find 命令在系统中搜索符合条件的文件名,如需匹配,使用通配符匹配是完全匹配。grep 命令在文件中搜索指定的字符串,如需匹配,则使用正则表达式是包含匹配。

以上就是Linux 命令 | 每日一学,文本处理三剑客之grep命令实践的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号