文本处理
grep

一、grep 指令基础

(一)grep 指令简介

grep 的英文全称是 Global Regular Express Print,主要用于在文本中提取关键信息,是 Linux 系统中重要的文本处理工具。它能通过匹配特定的模式,从文件或其他命令的输出结果中筛选出符合条件的内容 。

(二)grep 指令的简单应用

在实际操作中,grep常与其他命令结合使用。比如top | grep %Cpu,这条命令是先执行top命令,该命令用于查看系统的实时运行状态,然后将其输出结果通过管道|传递给grep %Cpugrep %Cpu会在top命令的输出内容中,查找包含%Cpu的行并显示出来 。 例如:

top | grep %Cpu

结果如下类似:

Cpu(s): 3.0us, 3.0sy, 0.0ni, 93.9id, 0.0wa, 0.0hi, 0.0si, 0.0st
%Cpu(s): 1.0us, 1.2sy, 0.0ni, 97.7id, 0.2wa, 0.0hi, 0.0si, 0.0st

这样就能快速获取系统 CPU 使用情况的相关信息 。

(三)grep 的两种使用方式

grep [parameters] [file or dir]:这种方式是直接在指定的文件或目录中查找匹配的内容。例如:

#在kernel.log文件中查找包含error这个字符串的行
grep error /var/log/kern.log*
#在kernel.log文件中查找以warn开头的内容 
grep "^warn" /var/log/kern.log*

[command] | grep [parameters]:先执行前面的命令,再将其输出结果作为grep的输入进行筛选。 比如cat /var/log/kern.log* | grep error,效果与grep error /var/log/kern.log*一致,都是在kern.log文件内容中查找包含error的行 。

二、grep 的常用参数

(一)-i(--ignore-case)

该参数用于忽略大小写进行匹配。在默认情况下,grep 是大小写敏感的。

#使用-i参数后,它不仅会查找warning,还能查找到Warning、WARNING等不同大小写形式的字符串 。
cat /var/log/kern.log* | grep warning -i

(二)-v(--invert-match)

反向查找,只打印不匹配的行。

#会显示kernel.log文件中所有不包含error的行
grep -v error /var/log/kern.log*

(三)-n(--line-number)

显示匹配行的行号。

#输出结果中除了显示包含error的行内容,还会在每行前面加上行号,方便快速定位 。
grep -n error /var/log/kern.log*

(四)-r(--recursive)

递归查找子目录中的文件。

#在/var/log/目录及其所有子目录下的文件中,查找包含kernel的内容,并显示文件名和所在行号 。
grep -nr "kernel" /var/log/

(五)-l(--file-with-matches)

只打印匹配的文件名。

#列出/var/log/目录下所有包含error字符串的日志文件名 。
grep -l error /var/log/*.log

(六)-c(--count)

只打印匹配的行数。

输出kernel.log文件中包含error的行数 
grep -c error /var/log/kernel.log*

(七)-e(--regexp)

用于多关键字匹配。

#在dmesg命令的输出结果中,查找包含eth0或Eth0的行
dmesg | grep -e "eth0" -e "Eth0"
#-E表示使用扩展正则表达式
dmesg | grep -E "eth0|Eth0"

三、grep 与正则表达式的结合

grep 可以和正则表达式配合使用,实现更灵活、强大的文本匹配功能 。

基本正则表达式匹配:

#用于查找以warning开头的内容
cat /var/log/kernel.log* | grep "^warning"
#查找以success结尾的内容 
cat /var/log/kernel.log* | grep "success$"

字符范围匹配:

#能查找包含Method0 - Method3的内容
cat /var/log/kernel.log* | grep "Method[0-3]"

多种形式匹配:

#可查找包含warning或Warning等形式的内容
cat /var/log/kernel.log* | grep "[wW]arning"
#查找以2023开头,以error结尾的内容 
cat /var/log/kernel.log* | grep "^2023.error$"

借助管道命令,grep 可以从大量日志中进行复杂的信息过滤

#这条命令首先在dmesg的输出结果中,查找包含/2023的行,然后在这些行中查找包含error(不区分大小写)的行,接着再筛选出包含数字的行,最后排除掉包含eth的行 
dmesg | grep "/2023" | grep error -i | grep "[0-9]" | grep -v "eth"

四、grep 应用实例

在实际工作中,经常会遇到需要查找特定文件的场景。 例如,有一个.so库,只知道它位于/lib或/lib64文件夹下,文件名里面带有code,但具体名字不清楚。通过grep筛选出符合条件的文件,从而缩小查找范围 。 这时可以使用:

ls -lha /lib*/* | grep code