Linux三剑客之 grep

柳三千

前言

grep(Global Regular Expression Print)是 Linux 和类 Unix 系统中一个非常强大且常用的文本搜索工具,用于在文本中查找匹配指定模式的行,并将匹配的行输出。


应用场景


    日志文件分析:在系统日志文件中查找特定的错误信息或事件记录。例如,grep "ERROR" /var/log/syslog 可以在系统日志中查找包含 "ERROR" 的行。

    代码搜索:在代码文件中查找特定的函数名、变量名或关键字。例如,grep -r "function_name" /path/to/code 可以在指定的代码目录中查找包含 "function_name" 的行。

    数据筛选:从大量文本数据中筛选出符合特定条件的数据。例如,grep "[0-9]{3}-[0-9]{2}-[0-9]{4}" data.txt 可以从 data.txt 文件中筛选出符合美国社会安全号码格式(如 123-45-6789)的行。


grep [选项] 模式 [文件...]
模式:指的是要查找的字符串或正则表达式。
文件:指定要在哪些文件中进行查找,如果不指定文件,grep 会从标准输入读取数据。

例如,在 test.txt 文件中查找包含 "apple" 的行:
grep "apple" test.txt


常用选项

-i:忽略大小写进行匹配。例如,grep -i "apple" test.txt 会查找包含 "apple"、"Apple"、"APPLE" 等的行。
-v:反向匹配,输出不包含指定模式的行。如 grep -v "apple" test.txt 会输出 test.txt 中不包含 "apple" 的行。
-r 或 -R:递归查找,用于在目录及其子目录下的所有文件中进行查找。例如,grep -r "apple" /path/to/directory 会在 /path/to/directory 目录及其子目录下的所有文件中查找包含 "apple" 的行。
-n:显示匹配行的行号。如 grep -n "apple" test.txt 会在输出匹配行的同时显示该行在文件中的行号。
-c:只输出匹配的行数,而不输出具体的匹配内容。例如,grep -c "apple" test.txt 会显示 test.txt 文件中包含 "apple" 的行数。
-C:用于在输出匹配行的同时,额外显示匹配行前后的若干行,帮助你更全面地了解匹配内容的上下文信息。
-w:只匹配完整的单词。例如,grep -w "apple" test.txt 只会匹配 "apple" 作为一个完整单词出现的行,而不会匹配 "applet" 等包含 "apple" 的字符串。


正则表达式支持
grep 支持基本正则表达式(BRE)和扩展正则表达式(ERE),通过 -E 选项可以使用扩展正则表达式。以下是一些常用的正则表达式元字符:

.:匹配任意单个字符。例如,grep "a.e" test.txt 会匹配 "abe"、"ace"、"ade" 等字符串。
*:匹配前面的字符零次或多次。例如,grep "ab*c" test.txt 会匹配 "ac"、"abc"、"abbbc" 等字符串。
^:匹配行的开头。例如,grep "^apple" test.txt 会匹配以 "apple" 开头的行。
$:匹配行的结尾。例如,grep "apple$" test.txt 会匹配以 "apple" 结尾的行。


练习文档

[ldx@VM-20-5-opencloudos ~]$ cat system_log.txt 
[2024-01-01 10:00:00] INFO: System started successfully.
[2024-01-01 10:05:00] WARN: Disk space is low, only 10GB left.
[2024-01-01 10:10:00] ERROR: Database connection failed.
[2024-01-01 10:15:00] INFO: User "John" logged in.
[2024-01-01 10:20:00] DEBUG: Query executed: SELECT * FROM users;
[2024-01-01 10:25:00] INFO: Service "WebServer" started.
[2024-01-01 10:30:00] WARN: High CPU usage detected, 90%.
[2024-01-01 10:35:00] ERROR: File not found: /var/www/html/index.html.
[2024-01-01 10:40:00] INFO: User "Alice" logged out.
[2024-01-01 10:45:00] DEBUG: Memory allocation: 512MB.


实战练习

#查找所有包含 INFO 级别的日志行
[ldx@VM-20-5-opencloudos ~]$ ls
1a.txt  1.txt  2.txt  3.txt  4.txt  5.txt  ABC.txt  ab.txt  alss  remoce.txt  sample.txt  system_log.txt  test  test2  testfile  x.txt

[ldx@VM-20-5-opencloudos ~]$ grep  -l INFO ./*. #只打印匹配的文件名
./system_log.txt

[ldx@VM-20-5-opencloudos ~]$ grep  INFO ./*
./system_log.txt:[2024-01-01 10:00:00] INFO: System started successfully.
./system_log.txt:[2024-01-01 10:15:00] INFO: User "John" logged in.
./system_log.txt:[2024-01-01 10:25:00] INFO: Service "WebServer" started.
./system_log.txt:[2024-01-01 10:40:00] INFO: User "Alice" logged out.


#查找所有不包含 DEBUG 级别的日志行
[ldx@VM-20-5-opencloudos ~]$ vim system_log.txt 
[ldx@VM-20-5-opencloudos ~]$ cat system_log.txt 
[2024-01-01 10:00:00] INFO: System started successfully.
[2024-01-01 10:05:00] WARN: Disk space is low, only 10GB left.
[2024-01-01 10:10:00] ERROR: Database connection failed.
[2024-01-01 10:15:00] INFO: User "John" logged in.
[2024-01-01 10:20:00] DEBUG: Query executed: SELECT * FROM users;
[2024-01-01 10:25:00] INFO: Service "WebServer" started.
[2024-01-01 10:30:00] WARN: High CPU usage detected, 90%.
[2024-01-01 10:35:00] ERROR: File not found: /var/www/html/index.html.
[2024-01-01 10:40:00] INFO: User "Alice" logged out.
[2024-01-01 10:45:00] DEBUG: Memory allocation: 512MB.

[ldx@VM-20-5-opencloudos ~]$ grep -v 'DEBUG' system_log.txt 
[2024-01-01 10:00:00] INFO: System started successfully.
[2024-01-01 10:05:00] WARN: Disk space is low, only 10GB left.
[2024-01-01 10:10:00] ERROR: Database connection failed.
[2024-01-01 10:15:00] INFO: User "John" logged in.
[2024-01-01 10:25:00] INFO: Service "WebServer" started.
[2024-01-01 10:30:00] WARN: High CPU usage detected, 90%.
[2024-01-01 10:35:00] ERROR: File not found: /var/www/html/index.html.
[2024-01-01 10:40:00] INFO: User "Alice" logged out.

#查找包含 ERROR 级别的日志行,并显示行号
[ldx@VM-20-5-opencloudos ~]$ grep -n "ERROR" system_log.txt 
3:[2024-01-01 10:10:00] ERROR: Database connection failed.
8:[2024-01-01 10:35:00] ERROR: File not found: /var/www/html/index.html.

[ldx@VM-20-5-opencloudos ~]$ grep -n "ERROR" ./*
./system_log.txt:3:[2024-01-01 10:10:00] ERROR: Database connection failed.
./system_log.txt:8:[2024-01-01 10:35:00] ERROR: File not found: /var/www/html/index.html.

#递归查找当前目录下所有文件(假设只有 system_log.txt)中包含 User 的行
[ldx@VM-20-5-opencloudos ~]$ grep -r "User" ./*
./system_log.txt:[2024-01-01 10:15:00] INFO: User "John" logged in.
./system_log.txt:[2024-01-01 10:40:00] INFO: User "Alice" logged out.

[ldx@VM-20-5-opencloudos ~]$ grep -r "User" .
./.bash_profile:# User specific environment and startup programs
./.bashrc:# User specific environment
./.bashrc:# User specific aliases and functions
./.bash_history:grep -r "User" ./*
./.bash_history:grep -r "User" .
./.bash_history:grep -r "User" ./*
grep: ./.ssh/id_rsa: Permission denied
./system_log.txt:[2024-01-01 10:15:00] INFO: User "John" logged in.
./system_log.txt:[2024-01-01 10:40:00] INFO: User "Alice" logged out.

#查找作为完整单词出现的 Service 的行
[ldx@VM-20-5-opencloudos ~]$ grep  -w "Service" system_log.txt 
[2024-01-01 10:25:00] INFO: Service "WebServer" started.

#统计包含 WARN 级别的日志行数
[ldx@VM-20-5-opencloudos ~]$ grep -c "WARN" system_log.txt
2

[ldx@VM-20-5-opencloudos ~]$ grep  "WARN" system_log.txt 
[2024-01-01 10:05:00] WARN: Disk space is low, only 10GB left.
[2024-01-01 10:30:00] WARN: High CPU usage detected, 90%.
[ldx@VM-20-5-opencloudos ~]$ grep   "WARN" system_log.txt  | wc -l
2

#查找以日期开头(格式为 [YYYY-MM-DD)的行
[ldx@VM-20-5-opencloudos ~]$ grep -P "\d{4}-\d{2}-\d{2}" system_log.txt 
[2024-01-01 10:00:00] INFO: System started successfully.
[2024-01-01 10:05:00] WARN: Disk space is low, only 10GB left.
[2024-01-01 10:10:00] ERROR: Database connection failed.
[2024-01-01 10:15:00] INFO: User "John" logged in.
[2024-01-01 10:20:00] DEBUG: Query executed: SELECT * FROM users;
[2024-01-01 10:25:00] INFO: Service "WebServer" started.
[2024-01-01 10:30:00] WARN: High CPU usage detected, 90%.
[2024-01-01 10:35:00] ERROR: File not found: /var/www/html/index.html.
[2024-01-01 10:40:00] INFO: User "Alice" logged out.
[2024-01-01 10:45:00] DEBUG: Memory allocation: 512MB.

[ldx@VM-20-5-opencloudos ~]$ grep -E "^\[[0-9]{4}-[0-9]{2}-[0-9]{2}" system_log.txt
[2024-01-01 10:00:00] INFO: System started successfully.
[2024-01-01 10:05:00] WARN: Disk space is low, only 10GB left.
[2024-01-01 10:10:00] ERROR: Database connection failed.
[2024-01-01 10:15:00] INFO: User "John" logged in.
[2024-01-01 10:20:00] DEBUG: Query executed: SELECT * FROM users;
[2024-01-01 10:25:00] INFO: Service "WebServer" started.
[2024-01-01 10:30:00] WARN: High CPU usage detected, 90%.
[2024-01-01 10:35:00] ERROR: File not found: /var/www/html/index.html.
[2024-01-01 10:40:00] INFO: User "Alice" logged out.
[2024-01-01 10:45:00] DEBUG: Memory allocation: 512MB.

#查找包含两个连续数字的行(使用扩展正则表达式)
[ldx@VM-20-5-opencloudos ~]$ grep -E "[0-9]{2}" system_log.txt
[2024-01-01 10:00:00] INFO: System started successfully.
[2024-01-01 10:05:00] WARN: Disk space is low, only 10GB left.
[2024-01-01 10:10:00] ERROR: Database connection failed.
[2024-01-01 10:15:00] INFO: User "John" logged in.
[2024-01-01 10:20:00] DEBUG: Query executed: SELECT * FROM users;
[2024-01-01 10:25:00] INFO: Service "WebServer" started.
[2024-01-01 10:30:00] WARN: High CPU usage detected, 90%.
[2024-01-01 10:35:00] ERROR: File not found: /var/www/html/index.html.
[2024-01-01 10:40:00] INFO: User "Alice" logged out.
[2024-01-01 10:45:00] DEBUG: Memory allocation: 512MB.

[ldx@VM-20-5-opencloudos ~]$ grep -P "\d{2}" system_log.txt
[2024-01-01 10:00:00] INFO: System started successfully.
[2024-01-01 10:05:00] WARN: Disk space is low, only 10GB left.
[2024-01-01 10:10:00] ERROR: Database connection failed.
[2024-01-01 10:15:00] INFO: User "John" logged in.
[2024-01-01 10:20:00] DEBUG: Query executed: SELECT * FROM users;
[2024-01-01 10:25:00] INFO: Service "WebServer" started.
[2024-01-01 10:30:00] WARN: High CPU usage detected, 90%.
[2024-01-01 10:35:00] ERROR: File not found: /var/www/html/index.html.
[2024-01-01 10:40:00] INFO: User "Alice" logged out.
[2024-01-01 10:45:00] DEBUG: Memory allocation: 512MB.
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码