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

发布时间 - 2025-06-26 00:00:00    点击率:

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


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

不管是哪一门编程语言,字符串类型都是极其重要的,因此在学习各种编程语言后会发现近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

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

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 '(?

weiyigeek.top-egrep命令扩展表达式案例

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

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


# linux  # centos  # windows  # 工具  # ai  # 区别  # shell脚本  # red  # asic  # Java  # php  # 正则表达式  # print  # 字符串  # 递归  # 字符串类型  # regexp  # 跳过  # 若有  # 行号  # 搜索结果  # 如需  # 后会  # 错误信息  # 中非 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 开心动漫网站制作软件下载,十分开心动画为何停播?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  如何在云指建站中生成FTP站点?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  北京专业网站制作设计师招聘,北京白云观官方网站?  如何快速查询网站的真实建站时间?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  深圳网站制作的公司有哪些,dido官方网站?  如何在万网ECS上快速搭建专属网站?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何用wdcp快速搭建高效网站?  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  如何在云服务器上快速搭建个人网站?  简单实现Android验证码  如何正确下载安装西数主机建站助手?  独立制作一个网站多少钱,建立网站需要花多少钱?  晋江文学城电脑版官网 晋江文学城网页版直接进入  电商网站制作价格怎么算,网上拍卖流程以及规则?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  iOS验证手机号的正则表达式  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  详解Oracle修改字段类型方法总结  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  如何在景安服务器上快速搭建个人网站?  Laravel如何记录自定义日志?(Log频道配置)  如何在 Pandas 中基于一列条件计算另一列的分组均值  JavaScript如何实现继承_有哪些常用方法  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何用PHP快速搭建高效网站?分步指南  实例解析angularjs的filter过滤器  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  七夕网站制作视频,七夕大促活动怎么报名?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  如何登录建站主机?访问步骤全解析  高端云建站费用究竟需要多少预算?  jQuery validate插件功能与用法详解  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Laravel怎么为数据库表字段添加索引以优化查询  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  如何在不使用负向后查找的情况下匹配特定条件前的换行符  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  免费视频制作网站,更新又快又好的免费电影网站?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  如何制作一个表白网站视频,关于勇敢表白的小标题?  百度浏览器如何管理插件 百度浏览器插件管理方法