Linux 或 Unix 系统中,如果字符串或单词匹配,则使用 Grep 统计行数
要计算与特定模式或单词/字符串匹配的行数,可以使用带有-c或--count选项的 grep 命令。此选项将抑制 grep 的正常输出,而是打印匹配行数的计数。您还可以使用-H选项在每个匹配行计数之前打印文件名,以便在使用通配符时轻松理解。让我们看看如何使用grep 命令和 zgrep 命令在找到匹配项时计算行数。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 或 Unix 终端 |
类别 | 搜索 |
操作系统兼容性 | BSD • Linux • macOS • Unix |
预计阅读时间 | 5 分钟 |
如果字符串/单词匹配,则计算行数
使用 grep 计算匹配项的过程如下:
- 打开终端应用程序
- 在 Linux 或类 Unix 系统上语法如下:
$ grep -c 'word-to-search' fileNameHere
- 例如,在/etc/passwd中搜索名为“vivek”的单词,并计算匹配的行数:
$ grep -c vivek /etc/passwd
或
$ grep -w -c vivek /etc/passwd
示例输出表明单词“vivek”出现了一次:1
- 但是,使用-v或--invert-match选项它将计算不匹配的行,输入:
$ grep -v -c vivek /etc/passwd
示例输出:45
在哪里,
- -c:仅显示每个文件中选定行的数量
- -v:选择不匹配的行
- --invert-match:同上。
使用 grep 命令计算 Linux 或 Unix 上的 /etc/passwd 文件中出现单词“vivek”和“root”的次数。
如何统计多个文件的单词数
在此示例中,计算字符串或单词“bar”在所有扩展名为 .log 的文件中出现的次数:
$ grep -c -H "bar" *.log
其中,
- grep 命令用于在文件中搜索模式。该*.log模式与 Linux 或 Unix 计算机上所有带有 .log 扩展名的文件匹配。
- 传递给 grep 的选项-c用于计算名为“bar”的模式或字符串出现的次数。
- 由于该*.log模式匹配系统上的许多文件,因此您需要将选项传递-H给 grep 命令以在每次匹配之前打印文件名。这可以使您在屏幕上更轻松地读取输出。
如何使用 Linux 的 grep 计算压缩文件中某个字符串的所有匹配项
.gz或
$ ls -l /var/log/nginx/
$ ls -l /var/log/nginx/*.gz
-rw-r----- 1 www-data adm 717 Jun 7 23:19 /var/log/nginx/access.log.10.gz -rw-r----- 1 www-data adm 125 Jun 5 20:53 /var/log/nginx/access.log.11.gz -rw-r----- 1 www-data adm 2514 Jun 15 23:01 /var/log/nginx/access.log.2.gz -rw-r----- 1 www-data adm 2170 Jun 14 22:46 /var/log/nginx/access.log.3.gz -rw-r----- 1 www-data adm 3516 Jun 13 23:27 /var/log/nginx/access.log.4.gz -rw-r----- 1 www-data adm 2926 Jun 12 23:51 /var/log/nginx/access.log.5.gz -rw-r----- 1 www-data adm 3260 Jun 11 23:27 /var/log/nginx/access.log.6.gz -rw-r----- 1 www-data adm 1733 Jun 10 23:17 /var/log/nginx/access.log.7.gz -rw-r----- 1 www-data adm 1991 Jun 9 23:15 /var/log/nginx/access.log.8.gz -rw-r----- 1 www-data adm 3872 Jun 8 23:41 /var/log/nginx/access.log.9.gz -rw-r----- 1 www-data adm 262 Jun 7 22:59 /var/log/nginx/error.log.10.gz -rw-r----- 1 www-data adm 289 Jun 5 21:03 /var/log/nginx/error.log.11.gz -rw-r----- 1 www-data adm 257 Jun 15 20:24 /var/log/nginx/error.log.2.gz -rw-r----- 1 www-data adm 291 Jun 14 22:48 /var/log/nginx/error.log.3.gz -rw-r----- 1 www-data adm 381 Jun 13 23:01 /var/log/nginx/error.log.4.gz -rw-r----- 1 www-data adm 366 Jun 12 20:23 /var/log/nginx/error.log.5.gz -rw-r----- 1 www-data adm 347 Jun 11 20:08 /var/log/nginx/error.log.6.gz -rw-r----- 1 www-data adm 272 Jun 10 20:26 /var/log/nginx/error.log.7.gz -rw-r----- 1 www-data adm 271 Jun 9 14:06 /var/log/nginx/error.log.8.gz -rw-r----- 1 www-data adm 338 Jun 8 22:17 /var/log/nginx/error.log.9.gz -rw-r----- 1 www-data adm 4402268 Jun 8 00:00 /var/log/nginx/plausible.example.com_https.access.log.10.gz -rw-r--r-- 1 root root 4608431 Jun 7 00:00 /var/log/nginx/plausible.example.com_https.access.log.11.gz -rw-r----- 1 www-data adm 4401215 Jun 16 00:00 /var/log/nginx/plausible.example.com_https.access.log.2.gz -rw-r----- 1 www-data adm 4609597 Jun 15 00:00 /var/log/nginx/plausible.example.com_https.access.log.3.gz -rw-r----- 1 www-data adm 4470934 Jun 14 00:00 /var/log/nginx/plausible.example.com_https.access.log.4.gz -rw-r----- 1 www-data adm 4251322 Jun 13 00:00 /var/log/nginx/plausible.example.com_https.access.log.5.gz -rw-r----- 1 www-data adm 2123802 Jun 12 00:00 /var/log/nginx/plausible.example.com_https.access.log.6.gz -rw-r----- 1 www-data adm 1919179 Jun 11 00:00 /var/log/nginx/plausible.example.com_https.access.log.7.gz -rw-r----- 1 www-data adm 3659767 Jun 10 00:00 /var/log/nginx/plausible.example.com_https.access.log.8.gz -rw-r----- 1 www-data adm 4049142 Jun 9 00:00 /var/log/nginx/plausible.example.com_https.access.log.9.gz -rw-r--r-- 1 root root 265 Jun 6 13:39 /var/log/nginx/plausible.example.com_https.error.log.2.gz
让我们尝试计算一下 /var/log/nginx 目录中所有以 .gz 为扩展名的文件中字符串“zgrab/0.x”出现的次数:
$ sudo grep -c -H 'zgrab/0.x' /var/log/nginx/*.gz
grep 命令将始终返回 0 个结果:
/var/log/nginx/access.log.10.gz:0 /var/log/nginx/access.log.11.gz:0 /var/log/nginx/access.log.2.gz:0 /var/log/nginx/access.log.3.gz:0 .... /var/log/nginx/access.log.9.gz:0 /var/log/nginx/error.log.10.gz:0 /var/log/nginx/error.log.11.gz:0 .... /var/log/nginx/error.log.8.gz:0 /var/log/nginx/error.log.9.gz:0 /var/log/nginx/plausible.example.com_https.access.log.10.gz:0 /var/log/nginx/plausible.example.com_https.access.log.11.gz:0 /var/log/nginx/plausible.example.com_https.access.log.2.gz:0 ..... /var/log/nginx/plausible.example.com_https.access.log.4.gz:0 /var/log/nginx/plausible.example.com_https.access.log.5.gz:0 /var/log/nginx/plausible.example.com_https.access.log.6.gz:0 ..... .. /var/log/nginx/plausible.example.com_https.error.log.2.gz:0
相反,您需要使用以下语法在 /var/log/nginx 目录中的所有压缩日志文件中搜索字符串“zgrab/0.x”:
$ sudo zgrep -c -H 'zgrab/0.x' /var/log/nginx/*.gz
现在您可以正确看到每个文件名的 grep 计数:
/var/log/nginx/access.log.10.gz:2 /var/log/nginx/access.log.11.gz:0 /var/log/nginx/access.log.2.gz:8 /var/log/nginx/access.log.3.gz:15 /var/log/nginx/access.log.4.gz:11 /var/log/nginx/access.log.5.gz:9 ... ..... /var/log/nginx/access.log.9.gz:17 /var/log/nginx/error.log.10.gz:0 /var/log/nginx/error.log.11.gz:0 /var/log/nginx/error.log.2.gz:0 /var/log/nginx/error.log.3.gz:0 .... /var/log/nginx/plausible.example.com_https.access.log.10.gz:11 /var/log/nginx/plausible.example.com_https.access.log.11.gz:4 /var/log/nginx/plausible.example.com_https.access.log.2.gz:0 .... ...... /var/log/nginx/plausible.example.com_https.error.log.2.gz:0
使用 zgrep 命令的原因是 grep 命令仅搜索文本文件,无法查看压缩文件。zgrep 命令旨在搜索压缩或 gzip 文件中的文本,它将所有指定的选项直接传递给 grep。
总结
我们可以轻松绕过该选项来抑制正常的 grep 或 egrep 命令输出。相反,它将打印每个输入文件的匹配行数。我建议您阅读 grep 命令手册页,通过键入以下 man 命令/info 命令或帮助命令(或在此处在线阅读)-c来获取更多信息:
帮助命令从最后一个命令输出:
$ man grep
$ man egrep
$ grep --help
$ man zgrep
$ egrep --help
$ grep --help | grep -E -- '-(c|H)'
-H, --with-filename print file name with output lines -c, --count print only a count of selected lines per FILE
它是如何工作的?阅读egrep 命令教程。