difference between grep Vs cat and grep

后端 未结 5 975
再見小時候
再見小時候 2020-12-29 05:53

i would like to know difference between below 2 commands, I understand that 2) should be use but i want to know the exact sequence that happens in 1) and 2) suppose filename

相关标签:
5条回答
  • 2020-12-29 06:28

    Functionally (in terms of output), those two are the same. The first one actually creates a separate process cat which simply send the contents of the file to standard output, which shows up on the standard input of the grep, because the shell has connected the two with a pipe.

    In that sense grep regex <filename is also equivalent but with one less process.

    Where you'll start seeing the difference is in variants when the extra information (the file names) is used by grep, such as with:

    grep -n regex filename1 filename2
    

    The difference between that and:

    cat filename1 filename2 | grep -n regex
    

    is that the former knows about the individual files whereas the latter sees it as one file (with no name).

    While the former may give you:

    filename1:7:line with regex in 10-line file
    filename2:2:another regex line
    

    the latter will be more like:

    7:line with regex in 10-line file
    12:another regex line
    

    Another executable that acts differently if it knows the file names is wc, the word counter programs:

    $ cat qq.in
    1
    2
    3
    
    $ wc -l qq.in           # knows file so prints it
    3 qq.in
    
    $ cat qq.in | wc -l     # does not know file
    3
    
    $ wc -l <qq.in          # also does not know file
    3
    
    0 讨论(0)
  • 2020-12-29 06:38

    If you want to check the actual execution time diffrence, first create a file with 100000 lines:

    user@server ~ $ for i in $(seq 1 100000); do echo line${1} >> test_f; done
    user@server ~ $ wc -l test_f
    100000 test_f
    

    Now measure:

    user@server ~ $ time grep line test_f
    #...
    real    0m1.320s
    user    0m0.101s
    sys     0m0.122s
    
    user@server ~ $  time cat test_f | grep line
    #... 
    real    0m1.288s
    user    0m0.132s
    sys     0m0.108s
    

    As we can see, the diffrence is not too big...

    0 讨论(0)
  • 2020-12-29 06:40

    Actually, though the outputs are the same;

    -$cat filename | grep regex
    

    This command looks for the content of the file "filename", then fetches regex in it; while

    -$grep regex filename
    

    This command directly searches for the content named regex in the file "filename"

    0 讨论(0)
  • 2020-12-29 06:41

    First one:

    cat filename | grep regex
    

    Normally cat opens file and prints its contents line by line to stdout. But here it outputs its content to pipe'|'. After that grep reads from pipe(it takes pipe as stdin) then if matches regex prints line to stdout. But here there is a detail grep is opened in new shell process so pipe forwards its input as output to new shell process.

    Second one:

    grep regex filename
    

    Here grep directly reads from file(above it was reading from pipe) and matches regex if matched prints line to stdout.

    0 讨论(0)
  • 2020-12-29 06:47

    Functionally they are equivalent, however, the shell will fork two processes for cat filename | grep regex and connect them with a pipe.

    0 讨论(0)
提交回复
热议问题