UNIX运维的十个好习惯(3)
您可以发送通过?xargs?来输出文件名的任何工具的输出,以便为其他某些接受文件名作为参数的工具获得参数列表,如以下示例所示: 清单 15.?xargs?工具的使用示例
xargs?命令不只用于传递文件名.您还可以在需要将文本筛选到单个行中的任何时候使用它: 清单 16. 好习惯 7 的示例:使用?xargs?工具来将文本筛选到单个行中
谨慎使用?xargs从技术上讲,使用?xargs?很少遇到麻烦.缺省情况下,文件结束字符串是下划线 (_);如果将该字符作为单个输入参数来发送,则它之后的所有内容将被忽略.为了防止这种情况发生,可以使用?-e?标志,它在不带参数的情况下完全禁用结束字符串. 了解何时 grep 应该执行计数——何时应该绕过避免通过管道将?grep?发送到?wc -l?来对输出行数计数.grep?的?-c?选项提供了对与特定模式匹配的行的计数,并且一般要比通过管道发送到 wc?更快,如以下示例所示: 清单 17. 好习惯 8 的示例:使用和不使用 grep 的行计数[code lang=”shell”]~ $ time grep and tmp/a/longfile.txt | wc -l real 0m0.097s real 0m0.013s 除了速度因素外,-c?选项还是执行计数的好方法.对于多个文件,带?-c?选项的?grep?返回每个文件的单独计数,每行一个计数,而针对?wc?的管道则提供所有文件的组合总计数. 然而,不管是否考虑速度,此示例都表明了另一个要避免地常见错误.这些计数方法仅提供包含匹配模式的行数——如果那就是您要查找的结果,这没什么问题.但是在行中具有某个特定模式的多个实例的情况下,这些方法无法为您提供实际匹配实例数量?的真实计数.归根结底,若要对实例计数,您还是要使用?wc?来计数.首先,使用?-o?选项(如果您的版本支持它的话)来运行?grep?命令.此选项仅?输出匹配的模式,每行一个模式,而不输出行本身.但是您不能将它与?-c?选项结合使用,因此要使用?wc -l?来对行计数,如以下示例所示: 清单 18. 好习惯 8 的示例:使用 grep 对模式实例计数
在此例中,调用?wc?要比第二次调用?grep?并插入一个虚拟模式(例如?grep -c)来对行进行匹配和计数稍快一点. 匹配输出中的某些字段,而不只是对行进行匹配当您只希望匹配输出行中特定字段?中的模式时,诸如?awk?等工具要优于?grep. 下面经过简化的示例演示了如何仅列出 12 月修改过的文件. 清单 19. 坏习惯 9 的示例:使用 grep 来查找特定字段中的模式
在此示例中,grep?对行进行筛选,并输出其修改日期和名称中带?Dec?的所有文件.因此,诸如 December_Report.pdf 等文件是匹配的,即使它自从一月份以来还未修改过.这可能不是您希望的结果.为了匹配特定字段中的模式,最好使用?awk,其中的一个关系运算符对确切的字段进行匹配,如以下示例所示: 清单 20. 好习惯 9 的示例:使用?awk?来查找特定字段中的模式
停止对 cat 使用管道grep?的一个常见的基本用法错误是通过管道将?cat?的输出发送到?grep?以搜索单个文件的内容.这绝对是不必要的,纯粹是浪费时间,因为诸如?grep?这样的工具接受文件名作为参数.您根本不需要在这种情况下使用?cat,如以下示例所示: 清单 21. 好习惯和坏习惯 10 的示例:使用带和不带?cat?的 grep[code lang=”shell”]~ $ time cat tmp/a/longfile.txt | grep and real 0m0.015s (编辑:ASP站长网) |