为什么要使用 cat + grep、sed、awk、……

sh/bash/dash/ksh/zsh等Shell脚本
头像
goodluck1982
帖子: 171
注册时间: 2007-07-05 2:48

Re: 为什么要使用 cat + grep、sed、awk、……

#16

帖子 goodluck1982 » 2008-12-26 9:21

greco 写了:再回复一下,貌似讨论这个没什么意义 :em02

不,很有意义!
我们不能误导刚刚接触 grep、sed的新手们

不能能让他们误以为grep本来就是这样用的: cat file | grep xxx
其实不是的!
这样才是grep的最标准用法: grep xxx file
cat file | grep xxx 是 cat的用法+管道+grep的用法的组合
而且这个cat在这里基本上没用(至于什么时候有用,我也想知道)
头像
goodluck1982
帖子: 171
注册时间: 2007-07-05 2:48

Re: 为什么要使用 cat + grep、sed、awk、……

#17

帖子 goodluck1982 » 2008-12-26 9:31

aerofox 写了:管道是不会做过滤的,有些程序倒是会区别对待终端IO和文件IO,可能有更多的程序采用不同的方法处理标准输入和命令行参数指定的文件,但真的没有发现grep、sed、awk这些常用程序有什么针对标准输入的特别处理,也没有发现cat对文件有什么过滤作用,所以我仍然至少这几个命令不用用管道,即使不喜欢用命令行参数,改为<改向也可以少打几个字符:)。
这个有道理
我也经常用管道,但绝不会把管道用在 cat 之后

这就好比,假如你给我一篇文章,让我从里面找一句话
我会直接从文章中找的
决不会先把这篇文章复印一遍,然后再从复印件中找。
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: 为什么要使用 cat + grep、sed、awk、……

#18

帖子 poet » 2008-12-26 9:51

你们争论这么多做什么呢?重要的问题在于 cat 本质是作什么的?grep对标准输入和标准输出究竟有什么不同的处理?

我在这里告诉大家,两者绝对是不同的!

cat 命令的含义是串接,也就是说 cat 的功能是把文件串接成一个文件。cat *.c 就把当前目录下的所有 .c 串接成一个文件并输出。——由于cat这个命令的用途是用于拼接,所以对于单个文件使用拼接没有意义,但是为了记忆命令的统一性,习惯性拼接没有坏处。

grep 的本质是查找,当从标准输入接收的时候,只显示查找到的匹配行,当从文件接收的时候,除了显示查找到的行还要显示文件名。——但是grep有一个很不一致的特性,就是当grep查找到的匹配行只在一个文件中时,不显示文件名,而在多个文件中时要显示文件名——这种不一致的行为导致了解析grep输出需要一些额外的判断。

使用 cat 命令能保证 grep 在匹配行上总是不输出文件名,方便了输出解析,这是好处之一。

好处之二是:管道是双进程同时运行的,在多核机器上,这能够提高效率。——之所以推荐管道是因为 Unix 起源于服务器,而服务器最初就是多CPU的,使用管道能够优化CPU使用,减轻服务器负担。

简单的说:如果使用 grep 带参数,那么读文件和处理都是一个进程。如果使用 cat 管道,那么用的是两个进程,效率更高。在多核普及的将来,绝对应当推荐尽可能的使用管道,即使认为管道是标准方式也在所不惜。
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

Re: 为什么要使用 cat + grep、sed、awk、……

#19

帖子 yaoms » 2008-12-26 10:07

很多时候不用 cat 的

另外cat是 conact 的缩写吧,是连接文件用的。例如: cat a b c d > allinone
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
goodluck1982
帖子: 171
注册时间: 2007-07-05 2:48

Re: 为什么要使用 cat + grep、sed、awk、……

#20

帖子 goodluck1982 » 2008-12-26 10:38

poet 写了:你们争论这么多做什么呢?重要的问题在于 cat 本质是作什么的?grep对标准输入和标准输出究竟有什么不同的处理?

我在这里告诉大家,两者绝对是不同的!

cat 命令的含义是串接,也就是说 cat 的功能是把文件串接成一个文件。cat *.c 就把当前目录下的所有 .c 串接成一个文件并输出。——由于cat这个命令的用途是用于拼接,所以对于单个文件使用拼接没有意义,但是为了记忆命令的统一性,习惯性拼接没有坏处。

grep 的本质是查找,当从标准输入接收的时候,只显示查找到的匹配行,当从文件接收的时候,除了显示查找到的行还要显示文件名。——但是grep有一个很不一致的特性,就是当grep查找到的匹配行只在一个文件中时,不显示文件名,而在多个文件中时要显示文件名——这种不一致的行为导致了解析grep输出需要一些额外的判断。

使用 cat 命令能保证 grep 在匹配行上总是不输出文件名,方便了输出解析,这是好处之一。

好处之二是:管道是双进程同时运行的,在多核机器上,这能够提高效率。——之所以推荐管道是因为 Unix 起源于服务器,而服务器最初就是多CPU的,使用管道能够优化CPU使用,减轻服务器负担。

简单的说:如果使用 grep 带参数,那么读文件和处理都是一个进程。如果使用 cat 管道,那么用的是两个进程,效率更高。在多核普及的将来,绝对应当推荐尽可能的使用管道,即使认为管道是标准方式也在所不惜。
这么说到还是很有道理的! :em03

不过,grep -H xxx file ,哪怕只有一个文件,也会输出文件名的
grep -h xxx file ,哪怕多个文件,也不输出文件名的

一个命令的执行时间是0.01秒或是0.001秒,对用户来说根本感觉不出来
但是如果是10秒和1秒,那对用户来说就不一样了
而用grep处理不太大的文件,所需的时间是很短的,用不用管道感觉不出来
只有在处理特别大或特别多的时候,或许才能感觉出不一样来

总之,用不用cat+管道,应该根据自己的需求来
用的时候知道自己为什么要用
而不应该是一味盲目的使用 cat+管道
以至于为什么这么做都不知道

所以我还是提倡,除非有自己的明确需求,否则完全没必要用 cat + 管道
尤其是我们在处理日常小任务时,可以少打好几个字母呢 :em09
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: 为什么要使用 cat + grep、sed、awk、……

#21

帖子 poet » 2008-12-26 13:20

goodluck1982 写了: 所以我还是提倡,除非有自己的明确需求,否则完全没必要用 cat + 管道
尤其是我们在处理日常小任务时,可以少打好几个字母呢 :em09
这让我联想到当年我学习 vi 时候的一个很有意思的事情:
vi 有一个 :w 命令存盘, :q 命令退出, : x 命令存盘加退出。当然实际上也可以使用 :wq 存盘退出。

最初我从来都觉得,既然有 : x 还要 :wq 做什么呢?省一个字母很好的呀,但是实际我用了六年 vi 下来,发现自己绝对习惯 :wq ,虽然我自己都不明白为什么我更习惯使用 wq。后来想:也许因为思维的延续性,也就是说我只用记住 w 和 q 就自动记住了 wq。虽然要多敲一个字母,它仍然更方便。

cat grep 这些命令常常被用于写脚本,一旦写出脚本就可以在一个循环中被成千上万的使用,这个时候效率的差异出来了,如果用管道能够令脚本执行时间缩短一半甚至更多,肯定大家会选择使用 cat 管道。那么如果你不写脚本的时候直接用 grep 是否更方便呢?回答是当然的,不写脚本的时候不用管道当然确实更方便。但是那些写惯了脚本的人一定会习惯使用 cat 管道,甚至他自己都不明白自己为什么习惯使用 cat,这不是强迫症,而是人类会倾向于更少的记忆东西,记忆了使用cat的这种形式之后就不愿意再多记忆一种形式。——所以到了最后,记忆哪种形式都成了一种自由,当然了,Linux 是个自由的系统,它赋予了你这种自由。
头像
goodluck1982
帖子: 171
注册时间: 2007-07-05 2:48

Re: 为什么要使用 cat + grep、sed、awk、……

#22

帖子 goodluck1982 » 2008-12-26 23:15

我以前也是用 wq 的
但自从知道了 x 后
就很少再用 wq 了
我比较追求简洁的东西

而且即使是在脚本里用grep,cat+管道所带来的效率提升
对最常见的任务来说也是完全可以忽略的
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 为什么要使用 cat + grep、sed、awk、……

#23

帖子 aerofox » 2008-12-27 19:23

不知有没有人实际对两种方式做过性能比较,我在本人机器(双核CPU)上实验没有发现用管道的好处。实验时用了个2.4G的文件 file。

代码: 全选

 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
看上去用上管道反倒效率下降了。管道后面的命令必须等待前面命令的结果,而且前面的进程执行速度是受磁盘IO限制的,所以我也没想清楚把它们并行执行有什么好处。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 为什么要使用 cat + grep、sed、awk、……

#24

帖子 BigSnake.NET » 2008-12-27 19:28

习惯问题,喜好问题

PS: 我喜欢 cat
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
goodluck1982
帖子: 171
注册时间: 2007-07-05 2:48

Re: 为什么要使用 cat + grep、sed、awk、……

#25

帖子 goodluck1982 » 2008-12-27 19:31

to 23#
呵呵,这个要顶! :em11
头像
goodluck1982
帖子: 171
注册时间: 2007-07-05 2:48

Re: 为什么要使用 cat + grep、sed、awk、……

#26

帖子 goodluck1982 » 2008-12-27 19:34

BigSnake.NET 写了:习惯问题,喜好问题

PS: 我喜欢 cat

一开始就接触了本来没什么必要的东西
久而久之习惯了就不想改了
我不提倡cat,就是不想误导新手
头像
greco
帖子: 2487
注册时间: 2007-04-06 10:24
来自: ~/Shanghai

Re: 为什么要使用 cat + grep、sed、awk、……

#27

帖子 greco » 2008-12-28 13:15

goodluck1982 写了:
BigSnake.NET 写了:习惯问题,喜好问题

PS: 我喜欢 cat

一开始就接触了本来没什么必要的东西
久而久之习惯了就不想改了
我不提倡cat,就是不想误导新手
你这个帖子出来,就是在给新手上课。
Linux在于自由,就让我等自己选择用cat + | 还是直接grep了 :em02
http://silenceisdefeat.com/~greco

代码: 全选

''.join([chr(ord(c)-2) for c in 'O{"G/ockn"ku<"itgeq0ujkBiockn0eqo'])
echo -n "Z3JlY28uc2hpQGdtYWlsLmNvbQ==" | base64 -d
头像
goodluck1982
帖子: 171
注册时间: 2007-07-05 2:48

Re: 为什么要使用 cat + grep、sed、awk、……

#28

帖子 goodluck1982 » 2008-12-28 13:22

greco 写了:
goodluck1982 写了:
BigSnake.NET 写了:习惯问题,喜好问题

PS: 我喜欢 cat

一开始就接触了本来没什么必要的东西
久而久之习惯了就不想改了
我不提倡cat,就是不想误导新手
你这个帖子出来,就是在给新手上课。
Linux在于自由,就让我等自己选择用cat + | 还是直接grep了 :em02
对,选择什么在于自己
不过要自由选择,得有一个开阔的视野才行
如果只知道一种形式,那就没的选择了 :em01
头像
冲浪板
论坛版主
帖子: 7513
注册时间: 2007-05-06 8:19

Re: 为什么要使用 cat + grep、sed、awk、……

#29

帖子 冲浪板 » 2009-01-02 9:11

LZ想得简单,但是有些事情是很复杂的;
grep ssl "/etc/httpd/conf/httpd.conf"

cat /etc/httpd/conf/httpd.conf | grep ssl
哪个便利呢?

思维不同吧,记得有个文章说“英文...”的,比如“我明天早上8:00乘常坐的那路车去找你”,不同的思维是“我要...去找你...乘车..常坐的那路车...8点...明早“

有些方式是边想边写,不用想好一整句再写;
比如我想看看httpd.conf里的关于ssl的部分,就可以
cat .... | grep ...

若用
grep ssl httpd.conf,就是想”我要看看ssl在这conf文件的那些行“,而且文件还要加”""” :em20

换词条的时候,后者也比前者方便,不是么 :em03
头像
goodluck1982
帖子: 171
注册时间: 2007-07-05 2:48

Re: 为什么要使用 cat + grep、sed、awk、……

#30

帖子 goodluck1982 » 2009-01-02 16:43

在更换搜索内容时,LS说的后者确实比前者方便一些
你只要知道你为什么那样做就可以了
这并不违背我的精神
我只是不希望正在学习脚本的朋友们一味盲目的那样做
回复