grep命令的用途以及优势
grep命令是一个强大且灵活的命令行工具,主要用于在文件中搜索文本字符串,并输出包含这些字符串的行。
- 文本搜索:grep最基本的用途是搜索特定的字符串或正则表达式(regex)。它可以快速在大量文件或数据中找到匹配的行。
- 高效性:grep是一个非常高效的工具,即使处理大文件也能迅速返回结果。相比手动查找,它可以节省大量时间。
- 支持正则表达式:grep支持正则表达式,这意味着你可以使用复杂的模式进行搜索,而不仅仅是简单的文本字符串。正则表达式使得grep非常强大,能够匹配多种复杂的文本模式。
- 多文件多字符串搜索:grep可以同时搜索多个文件,甚至可以递归搜索目录中的所有文件。这样在处理大型项目时非常有用。并且还可以同时搜索多个字符串
- 上下文显示:grep可以显示匹配行的上下文(例如,前几行和后几行),这对于理解匹配内容在文件中的位置和含义非常有帮助。使用选项如-C、-B、-A等可以实现这一点。
- 多平台支持:grep是一个跨平台工具,几乎在所有的Unix/Linux系统以及Windows(通过Cygwin或Git Bash等环境)上都可以使用。
- 结合其他命令使用:grep可以与其他命令结合使用,通过管道(|)将其他命令的输出传递给grep进行过滤。例如,ps aux | grep apache可以过滤出所有与apache相关的进程。
- 排除匹配:grep不仅可以用于查找匹配的行,还可以用-v选项来排除匹配的行,这在需要排除某些特定内容时非常有用。
- 统计功能:使用-c选项,grep可以统计匹配的行数。使用-o选项,可以只输出匹配的部分,并使用管道和wc -l组合统计匹配次数。
- 颜色高亮:通过–color=auto选项,可以使grep在输出中高亮显示匹配的文本,便于快速定位。
grep命令在文本处理、日志分析、代码查找等方面极其有用,是每个开发者和系统管理员都应该掌握的基本工具之一。
grep命令的使用
命令的格式
grep [选项] pattern filename
文件准备
文件名为:application.log
2023-10-01 12:00:00 INFO Starting application
2023-10-01 12:00:01 DEBUG Initializing database connection
2023-10-01 12:00:02 INFO Database connection established
2023-10-01 12:00:03 WARN Configuration file not found, using defaults
2023-10-01 12:00:04 ERROR Failed to load user settings
2023-10-01 12:00:05 INFO Application running
2023-10-01 12:00:10 DEBUG Processing user request
2023-10-01 12:00:11 INFO User request processed successfully
2023-10-01 12:00:12 ERROR Failed to process payment
2023-10-01 12:00:13 WARN Payment gateway timeout, retrying
2023-10-01 12:00:14 INFO Payment processed on retry
2023-10-01 12:00:20 DEBUG Closing database connection
2023-10-01 12:00:21 INFO Database connection closed
2023-10-01 12:00:22 INFO Shutting down application
2023-10-01 12:00:23 DEBUG Application shutdown complete
使用实例
查找ERROR字符串
cat application.log | grep ERROR
#或者
grep ERROR application.log
#或者
grep "ERROR" application.log #在搜索的pattern中间没有空格等符号之前,有没有引号是等价的。如果搜索的是ERROR 1则必须加引号
忽略大小写
cat application.log | grep -i error
#或者
grep -i Error application.log
#或者
grep -i "ErROr" application.log #在搜索的pattern中间没有空格等符号之前,有没有引号是等价的。如果搜索的是ERROR 1则必须加引号
查找多个字符串ERROR和WARN
cat application.log | grep -Ei "error|warn"
#或者
grep -Ei "warn|error" application.log
查询除了INFO之外的行
cat application.log | grep -vi info
#或者
grep -vi info application.log
#或者
grep -vi "info" application.log #在搜索的pattern中间没有空格等符号之前,有没有引号是等价的。如果搜索的是ERROR 1则必须加引号
精确匹配
grep "\<on\>" application.log #只会搜索on字符串
grep "on" application.log #会将含有on的字符串一起筛选出来
只显示匹配到的字符串部分
cat application.log | grep -oi info
#或者
grep -oi info application.log
#或者
grep -oi "info" application.log #在搜索的pattern中间没有空格等符号之前,有没有引号是等价的。如果搜索的是ERROR 1则必须加引号
筛选多个字符串并且计数【不能和排除匹配-v一起使用】
不能和排除匹配-v一起使用,因为排除模式只是排除对应字符串的行,并不能统计其他类别的数目,所以这两个选项是不能一起用的。
# 筛选多个字符串并且统计个数
grep -Eio "info|warn|error" application.log | wc -l
grep -Eioc "info|warn|error" application.log
# 各个分类的个数, -c就是count的意思,计数
grep -Eio "info|warn|error" application.log | sort | uniq -c
显示之前和之后的行数
#展示error字符串所在行前后1行的行
cat application.log | grep -C 1 ERROR
grep -C 1 ERROR application.log
grep -C 1 "ERROR" application.log
递归搜索
可以将-r开关与grep一起使用,以递归方式搜索目录及其子目录中的所有文件,以查找指定的模式。
grep -r pattern /directory/to/search #命令格式
grep -r "ERROR" ./
使用正则表达式
grep "y$" application.log #筛选除y结尾的行,正则表达式的语法需要另外去学习
其他参考:https://cloud.tencent.com/developer/article/1554542