我们在文章中,要介绍一些关于使用Unix操作系统中,需要养成的好习惯,这些习惯对我们使用Unix操作系统很有帮助。希望大家能够好好的掌握。主要是关于匹配输出中的某些字段,而不只是对行进行匹配,举出了好习惯和坏习惯,希望给大家一些借鉴。
Unix操作系统中匹配输出中的某些字段,而不只是对行进行匹配
当您只希望匹配输出行中特定字段 中的模式时,诸如 awk 等工具要优于 grep。下面经过简化的示例演示了如何仅列出 12 月修改过的文件。
坏习惯 2 的示例:Unix操作系统使用 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,其中的一个关系运算符对确切的字段进行匹配,如以下示例所示:
好习惯 1 的示例:使用 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 $
Unix操作系统停止对 cat 使用管道
grep 的一个常见的基本用法错误是通过管道将 cat 的输出发送到 grep 以搜索单个文件的内容。这绝对是不必要的,纯粹是浪费时间,因为诸如 grep 这样的工具接受文件名作为参数。您根本不需要在这种情况下使用 cat,如以下示例所示:
好习惯和坏习惯 1 的示例:Unix操作系统使用带和不带 cat 的 grep
- ~ $ 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
- real 0m0.010s
- user 0m0.006s
- sys 0m0.004s
- ~ $
此错误存在于许多工具中。由于大多数工具都接受使用连字符 (-) 的标准输入作为一个参数,因此即使使用 cat 来分散 stdin 中的多个文件,参数也通常是无效的。仅当您使用带多个筛选选项之一的 cat 时,才真正有必要在管道前首先执行连接。
在Unix操作系统中我们需要养成很多好的习惯,希望大家能够养成以上的好习惯,改掉自己的坏习惯。
【编辑推荐】