UNIX 高手的10 个习惯( 四 )


清单 17. 好习惯 8 的示例:使用和不使用 grep 的行计数
~ $ time grep and tmp/a/longfile.txt | wc -l
2811
real0m0.097s
user0m0.006s
sys 0m0.032s
~ $ time grep -c and tmp/a/longfile.txt
2811
real0m0.013s
user0m0.006s
sys 0m0.005s
~ $
除了速度因素外,-c 选项还是执行计数的好方法 。对于多个文件,带 -c 选项的 grep 返回每个文件的单独计数,每行一个计数,而针对 wc 的管道则提供所有文件的组合总计数 。
然而,不管是否考虑速度,此示例都表明了另一个要避免地常见错误 。这些计数方法仅提供包含匹配模式的行数——如果那就是您要查找的结果,这没什么问题 。但是在行中具有某个特定模式的多个实例的情况下,这些方法无法为您提供实际匹配实例数量 的真实计数 。归根结底,若要对实例计数,您还是要使用 wc 来计数 。首先,使用 -o 选项(如果您的版本支持它的话)来运行 grep 命令 。此选项仅 输出匹配的模式,每行一个模式,而不输出行本身 。但是您不能将它与 -c 选项结合使用,因此要使用 wc -l 来对行计数,如以下示例所示:
清单 18. 好习惯 8 的示例:使用 grep 对模式实例计数
~ $ grep -o and tmp/a/longfile.txt | wc -l
3402
~ $
在此例中,调用 wc 要比第二次调用 grep 并插入一个虚拟模式(例如 grep -c)来对行进行匹配和计数稍快一点 。
匹配输出中的某些字段,而不只是对行进行匹配
当您只希望匹配输出行中特定字段 中的模式时,诸如 awk 等工具要优于 grep 。
下面经过简化的示例演示了如何仅列出 12 月修改过的文件 。
清单 19. 坏习惯 9 的示例:使用 grep 来查找特定字段中的模式
~/tmp $ ls -l /tmp/a/b/c | grep Dec
-rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf
-rw-r--r-- 1 root root 238 Dec 03 08:19 README
-rw-r--r-- 3 joe joe5096 Dec 14 14:26 archive.tar
~/tmp $
在此示例中,grep 对行进行筛选,并输出其修改日期和名称中带 Dec 的所有文件 。因此,诸如 December_Report.pdf 等文件是匹配的,即使它自从一月份以来还未修改过 。这可能不是您希望的结果 。为了匹配特定字段中的模式,最好使用 awk,其中的一个关系运算符对确切的字段进行匹配,如以下示例所示:
清单 20. 好习惯 9 的示例:使用 awk 来查找特定字段中的模式
~/tmp $ ls -l | awk '$6 == "Dec"'
-rw-r--r-- 3 joe joe5096 Dec 14 14:26 archive.tar
-rw-r--r-- 1 root root 238 Dec 03 08:19 README
~/tmp $
有关如何使用 awk 的更多详细信息,请参见参考资料 。
停止对 cat 使用管道
grep 的一个常见的基本用法错误是通过管道将 cat 的输出发送到 grep 以搜索单个文件的内容 。这绝对是不必要的,纯粹是浪费时间,因为诸如 grep 这样的工具接受文件名作为参数 。您根本不需要在这种情况下使用 cat,如以下示例所示:
清单 21. 好习惯和坏习惯 10 的示例:使用带和不带 cat 的 grep~ $ time cat tmp/a/longfile.txt | grep and
2811
real0m0.015s
user0m0.003s
sys 0m0.013s
~ $ time grep and tmp/a/longfile.txt
2811
real0m0.010s
user0m0.006s
sys 0m0.004s
~ $
此错误存在于许多工具中 。由于大多数工具都接受使用连字符 (-) 的标准输入作为一个参数,因此即使使用 cat 来分散 stdin 中的多个文件,参数也通常是无效的 。仅当您使用带多个筛选选项之一的 cat 时,才真正有必要在管道前首先执行连接 。
结束语:养成好习惯
【UNIX 高手的10 个习惯】最好检查一下您的命令行习惯中的任何不良的使用模式 。不良的使用模式会降低您的速度,并且通常会导致意外错误 。本文介绍了 10 个新习惯,它们可以帮助您摆脱许多最常见的使用错误 。养成这些好习惯是加强您的 Unix 命令行技能的积极步骤 。

推荐阅读