Vantagens do arquivo cat'ing e canalização para grep

19

Existem vantagens adicionais em criar um arquivo e enviá-lo para grep, além de conveniência? A conveniência é que, quando recupero comandos como os que estão abaixo do meu histórico, o cursor está no final da linha; portanto, é fácil modificar o comando com texto diferente para grep no mesmo arquivo.

Então, que outras vantagens podem ter para a seguinte convenção:

cat /var/tmp/trace.2043925204.xt | grep -in profile
cat /var/tmp/trace.2043925204.xt | grep -n Profile-Main

ao invés de:

grep -in profile /var/tmp/trace.2043925204.xt 
grep -n Profile-Main /var/tmp/trace.2043925204.xt 
George Jempty
fonte

Respostas:

21

Melhor evitar gato; escreva desta maneira se a edição de linha for importante:

$ < filename grep pattern

O motivo é que enviar todos os dados pelo gato custa recursos de memória e CPU. Outro benefício de passar o nome do arquivo como argumento, em vez de redirecionar o stdin, é que ele permite ao comando a opção de mmap () o arquivo.

Phil
fonte
9

Não acredito que ninguém tenha mencionado "Uso inútil de gato" http://www.smallo.ruhr.de/award.html ainda

Há uma vantagem questionável. Se você tem um pipeline longo, parece um pouco mais ortogonal com o gato:

cat file | command1 | command 2 | command3

Agrupa todos os comandos juntos.

Obviamente, como outros já disseram (e eu faço)

< file command1 | command2 | command3

Executa praticamente a mesma coisa. Dito isto, o gato é bem pequeno e não derrubará o computador se você o usar quando realmente não precisar.

Normalmente, usar catvs bater diretamente em um arquivo não muda nada, mas faz diferença para certos comandos que se importam se houver vários arquivos como argumentos, como grep. Caso em questão:

cat file1 file2 | grep SOMETHING

terá saída diferente da

grep SOMETHING file1 file2

Qual terá os nomes de arquivos correspondentes na saída. Há momentos em que não quero os nomes de arquivos, e é uma vantagem usar cat.

Rich Homolka
fonte
1
caté muito mais claro do que ler <. Ou talvez apenas para nós, que pensamos que o Unix e o bash poderiam aprender muito com o VMS e o DCL.
RonJohn
8

Não há vantagem. Seu cursor estar no final também não importa muito se você o estrutura assim:< inputfile grep -args foo

Daenyth
fonte
6

Você simplesmente não precisa usar gato nesta situação. É desnecessário e uma perda de tempo, porque ferramentas como o grep tomam nomes de arquivos como argumentos.

[root@un1xf00 root]# time cat passwd | grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

real    0m0.021s
user    0m0.000s
sys     0m0.030s
[root@un1xf00 root]# time grep root passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

real    0m0.002s
user    0m0.000s
sys     0m0.000s
[root@un1xf00 root]#

Atualização: Obrigado, @Andy Lester, por apontar que esses horários não levam em conta o cache do disco. Eu aprendi algo novo! Mas a economia de uma fração de segundo não faz muita diferença de qualquer maneira. Eu apenas acho que colocar o gato no grep não é uma maneira lógica de fazer as coisas. É como pedir a alguém para ajudá-lo com um problema, quando você é perfeitamente capaz de resolvê-lo.

dogbane
fonte
1
@ Michael: A -10 para você por ser obtuso. Você poderia ter sido mais útil. Pena que você não verá isso, pois você não tem uma conta aqui.
Pausado até novo aviso.
4
Michael está dizendo que os horários acima não levam em consideração o cache do disco. (e uma -0.29 para Dennis por ser mais interessado em bater para baixo Michael do que de-obtusing a resposta)
Andy Lester
1
Suponho que se deve haver ruído ao invés de sinalizar que os comentários são o lugar para isso. Obrigado, Andy, como eu não sabia, Michael estava se referindo ao cache do disco.
George Jempty
3

A facilidade de edição é a única vantagem real, e se você estiver fazendo isso na linha de comando, qualquer tempo adicional necessário para executar cate executar o pipe não fará realmente diferença.

Não há razão para fazê-lo em um shell script, no entanto.

Blrfl
fonte
2

Não há benefício algum. Em vez de se preocupar em modificar os comandos, aprenda a navegar melhor na linha de comando do shell com teclas e atalhos do acelerador.

Andy Lester
fonte
1

Não e pode até ser minuciosamente mais lento no exemplo que você dá.

A pipeé criado entre cat e grep, o que não é necessário ao passar o nome do arquivo diretamente para grep. No entanto, não creio que, em hipótese alguma, você observe limitações de taxa de transferência por causa disso.

Outras vantagens da entrada de tubulação no grep incluem processamento adicional anterior, como o uso de utilitários com recursos mais avançados de leitura de arquivos. (Veja tee, zcatentre outros).

Matt Joiner
fonte