greco 写了:再回复一下,貌似讨论这个没什么意义
不,很有意义!
我们不能误导刚刚接触 grep、sed的新手们
不能能让他们误以为grep本来就是这样用的: cat file | grep xxx
其实不是的!
这样才是grep的最标准用法: grep xxx file
而 cat file | grep xxx 是 cat的用法+管道+grep的用法的组合
而且这个cat在这里基本上没用(至于什么时候有用,我也想知道)
greco 写了:再回复一下,貌似讨论这个没什么意义
这个有道理aerofox 写了:管道是不会做过滤的,有些程序倒是会区别对待终端IO和文件IO,可能有更多的程序采用不同的方法处理标准输入和命令行参数指定的文件,但真的没有发现grep、sed、awk这些常用程序有什么针对标准输入的特别处理,也没有发现cat对文件有什么过滤作用,所以我仍然至少这几个命令不用用管道,即使不喜欢用命令行参数,改为<改向也可以少打几个字符:)。
这么说到还是很有道理的!poet 写了:你们争论这么多做什么呢?重要的问题在于 cat 本质是作什么的?grep对标准输入和标准输出究竟有什么不同的处理?
我在这里告诉大家,两者绝对是不同的!
cat 命令的含义是串接,也就是说 cat 的功能是把文件串接成一个文件。cat *.c 就把当前目录下的所有 .c 串接成一个文件并输出。——由于cat这个命令的用途是用于拼接,所以对于单个文件使用拼接没有意义,但是为了记忆命令的统一性,习惯性拼接没有坏处。
grep 的本质是查找,当从标准输入接收的时候,只显示查找到的匹配行,当从文件接收的时候,除了显示查找到的行还要显示文件名。——但是grep有一个很不一致的特性,就是当grep查找到的匹配行只在一个文件中时,不显示文件名,而在多个文件中时要显示文件名——这种不一致的行为导致了解析grep输出需要一些额外的判断。
使用 cat 命令能保证 grep 在匹配行上总是不输出文件名,方便了输出解析,这是好处之一。
好处之二是:管道是双进程同时运行的,在多核机器上,这能够提高效率。——之所以推荐管道是因为 Unix 起源于服务器,而服务器最初就是多CPU的,使用管道能够优化CPU使用,减轻服务器负担。
简单的说:如果使用 grep 带参数,那么读文件和处理都是一个进程。如果使用 cat 管道,那么用的是两个进程,效率更高。在多核普及的将来,绝对应当推荐尽可能的使用管道,即使认为管道是标准方式也在所不惜。
这让我联想到当年我学习 vi 时候的一个很有意思的事情:goodluck1982 写了: 所以我还是提倡,除非有自己的明确需求,否则完全没必要用 cat + 管道
尤其是我们在处理日常小任务时,可以少打好几个字母呢
代码: 全选
time grep 1000 /tmp/file > /dev/null ; time cat /tmp/file | grep 1000 > /dev/null
real 0m31.552s
user 0m3.856s
sys 0m1.832s
real 0m31.212s
user 0m6.600s
sys 0m4.992s
time grep 1000 /tmp/file > /dev/null ; time cat /tmp/file | grep 1000 > /dev/null
real 0m31.065s
user 0m3.692s
sys 0m1.848s
real 0m31.829s
user 0m6.020s
sys 0m4.544s
time grep 1000 /tmp/file > /dev/null ; time cat /tmp/file | grep 1000 > /dev/null
real 0m31.059s
user 0m3.860s
sys 0m1.804s
real 0m31.162s
user 0m6.472s
sys 0m4.700s
BigSnake.NET 写了:习惯问题,喜好问题
PS: 我喜欢 cat
你这个帖子出来,就是在给新手上课。goodluck1982 写了:BigSnake.NET 写了:习惯问题,喜好问题
PS: 我喜欢 cat
一开始就接触了本来没什么必要的东西
久而久之习惯了就不想改了
我不提倡cat,就是不想误导新手
代码: 全选
''.join([chr(ord(c)-2) for c in 'O{"G/ockn"ku<"itgeq0ujkBiockn0eqo'])
echo -n "Z3JlY28uc2hpQGdtYWlsLmNvbQ==" | base64 -d
对,选择什么在于自己greco 写了:你这个帖子出来,就是在给新手上课。goodluck1982 写了:BigSnake.NET 写了:习惯问题,喜好问题
PS: 我喜欢 cat
一开始就接触了本来没什么必要的东西
久而久之习惯了就不想改了
我不提倡cat,就是不想误导新手
Linux在于自由,就让我等自己选择用cat + | 还是直接grep了