[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]
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 命令 | 每日一学,文本处理三剑客之grep命令实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号