设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 安全 > 正文

UNIX运维的十个好习惯(3)

发布时间:2021-01-04 06:24 所属栏目:53 来源:网络整理
导读:~ $ xargsabcControl-D a b c ~ $ 您可以发送通过?xargs?来输出文件名的任何工具的输出,以便为其他某些接受文件名作为参数的工具获得参数列表,如以下示例所示: 清单 15.?xargs?工具的使用示例 ~/tmp $ ls -1 | xar

~ $ xargsabcControl-D
a b c
~ $

您可以发送通过?xargs?来输出文件名的任何工具的输出,以便为其他某些接受文件名作为参数的工具获得参数列表,如以下示例所示:

清单 15.?xargs?工具的使用示例

~/tmp $ ls -1 | xargs
December_Report.pdf README a archive.tar mkdirhier.sh
~/tmp $ ls -1 | xargs file
December_Report.pdf: PDF document,version 1.3
README: ASCII text
a: directory
archive.tar: POSIX tar archive
mkdirhier.sh: Bourne shell script text executable
~/tmp $

xargs?命令不只用于传递文件名.您还可以在需要将文本筛选到单个行中的任何时候使用它:

清单 16. 好习惯 7 的示例:使用?xargs?工具来将文本筛选到单个行中

~/tmp $ ls -l | xargs
-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 drwxr-xr-x 38 joe joe 354082 Nov 02 \
16:07 a -rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar -rwxr-xr-x 1 \
joe joe 3239 Sep 30 12:40 mkdirhier.sh
~/tmp $

谨慎使用?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
2811

real 0m0.097s
user 0m0.006s
sys 0m0.032s
~ $ time grep -c and tmp/a/longfile.txt
2811

real 0m0.013s
user 0m0.006s
sys 0m0.005s
~ $[/code]

除了速度因素外,-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 joe 5096 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 joe 5096 Dec 14 14:26 archive.tar
-rw-r--r-- 1 root root 238 Dec 03 08:19 README
~/tmp $

停止对 cat 使用管道

grep?的一个常见的基本用法错误是通过管道将?cat?的输出发送到?grep?以搜索单个文件的内容.这绝对是不必要的,纯粹是浪费时间,因为诸如?grep?这样的工具接受文件名作为参数.您根本不需要在这种情况下使用?cat,如以下示例所示:

清单 21. 好习惯和坏习惯 10 的示例:使用带和不带?cat?的 grep

[code lang=”shell”]~ $ time cat tmp/a/longfile.txt | grep and
2811

real 0m0.015s
user 0m0.003s
sys 0m0.013s
~ $ time grep and tmp/a/longfile.txt
2811

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读