Eu sei que cat
posso fazer isso, mas seu principal objetivo é concatenar, em vez de apenas exibir o conteúdo.
Eu também conheço less
e more
, mas estou procurando por algo simples ( não um pager ) que apenas envie o conteúdo de um arquivo para o terminal e seja feito especificamente para isso, se houver.
cat
concatena.a+b+c
envolve a realização de duas adições, e a computaçãoa
não envolve a adição de nada. Da mesma forma, executarcat f
não envolve concatenar nada (mesmo que essa seja a única coisa que "concatenar uma sequência de um arquivo" possa significar).cat
lê um arquivo e grava outro arquivo (stream), mas isso não significa que concatenou alguma coisa. Talvez você queira dizer quecat f
realmente está fazendocat - f
, isso simplesmente não é verdade.cat
foi realmente feito para concatenar (cat file1 file2
concatenará os dois arquivos para o stdout). Mas o efeito colateral é que, ao ter apenas um arquivo como argumento, ele gera esse arquivo para stdout (onde quer que vá, seja no seu terminal ou redirecionado para alguma coisa). Portanto, não havia outro comando criado apenas para produzir no stdout, comocat
existia e o permitia simplesmente. Portanto, você deseja usarcat
.Respostas:
O mais óbvio é
cat
. Mas, também dê uma olhadahead
etail
. Há também outros utillities shell para imprimir um arquivo linha por linha:sed
,awk
,grep
. Mas isso é para alternar o conteúdo do arquivo ou pesquisar dentro do arquivo.Fiz alguns testes para estimar qual é o mais eficaz. Eu corro todo o caminho
strace
para ver o que fez menos chamadas de sistema. Meu arquivo tem 1275 linhas.awk
: 1355 chamadas do sistemacat
: 51 chamadas do sistemagrep
: 1337 chamadas do sistemahead
: 93 chamadas do sistematail
: 130 chamadas do sistemased
: 1378 chamadas do sistemaComo você pode ver, mesmo que tenha
cat
sido projetado para concatenar arquivos, é o mais rápido e eficaz.sed
,awk
Egrep
imprimiu o arquivo linha por linha, por isso que eles têm mais que 1275 chamadas do sistema.fonte
O objetivo
cat
é exatamente isso, leia um arquivo e envie para stdout.fonte
cat --help
diz "Concatenar FILE (s), ou entrada padrão, para saída padrão". Eu não quero concatenar nadareadlink /dev/fd/1
por exemplo - você deve colocar o nome do seu tty lá se estiver executando em um prompt padrão. Portanto, concatenar entrada e saída é o que você está pedindo para fazer.Primeiro,
cat
escreve na saída padrão, que não é necessariamente um terminal, mesmo que tenhacat
sido digitado como parte de um comando em um shell interativo. Se você realmente precisa escrever algo no terminal, mesmo quando a saída padrão é redirecionada, isso não é tão fácil (você precisa especificar qual terminal e talvez não exista um se o comando for executado a partir de um script), embora um poderia (ab) usar a saída de erro padrão se o comando for apenas uma parte de um pipeline. Mas como você indicou quecat
realmente faz o trabalho, suponho que não estava perguntando sobre essa situação.Se o seu objetivo fosse enviar o que está escrito para a saída padrão em um pipeline, o uso
cat
seria elegível para o Useless Use of Cat Award , poiscat file | pipeline
(ondepipeline
está qualquer pipeline) pode ser feito com mais eficiência<file pipeline
. Mas, novamente, pelas suas palavras deduzo que essa não era sua intenção.Portanto, não está tão claro com o que você está se preocupando. Se você achar
cat
muito tempo para digitar, poderá definir um alias de um ou dois caracteres (ainda existem alguns desses nomes que permanecem sem uso no Unix padrão). Se, no entanto, você está preocupado com o fato decat
gastar ciclos inúteis, não deveria.Se houver um programa
null
que não aceite argumentos e apenas copie a entrada padrão para a saída padrão (o objeto neutro para pipelines), você poderá fazer o que quiser<file null
. Não existe um programa desse tipo, embora seja fácil escrever (um programa C com apenas umamain
função de uma linha pode fazer o trabalho), mas chamarcat
sem argumentos (oucat -
se você quiser ser explícito) faz exatamente isso.Se houvesse um
nocat
programa que recebesse exatamente um argumento de nome de arquivo, tentasse abrir o arquivo, o reclamasse se não puder e, caso contrário, continuasse copiando do arquivo para a saída padrão, isso seria exatamente o que você estava solicitando. É apenas um pouco mais difícil de escrever do quenull
, o trabalho principal é abrir o arquivo, testar e possivelmente reclamar (se você for meticuloso, também poderá incluir um teste de que existe exatamente um argumento e reclamar do contrário). Mascat
, novamente , agora fornecido com um único argumento, faz exatamente isso, portanto não há necessidade de nenhumnocat
programa.Depois de escrever o
nocat
programa, por que parar com um único argumento? Envolvendo o código em um loop nãofor(;*argp!=NULL;++argp)
é realmente um esforço, adiciona no máximo algumas instruções da máquina ao binário e evita a necessidade de reclamar sobre um número errado de argumentos (o que poupa muito mais instruções). Voilà uma versão primitivacat
, concatenando arquivos. (Para ser honesto, você precisa ajustá-lo um pouco para que, sem argumentos, ele se comporte comonull
.)Obviamente, no
cat
programa real , eles acrescentaram alguns sinos e assobios, porque sempre o fazem. Mas a essência é que o aspecto de "concatenação" doscat
custos realmente não exige nenhum esforço, nem para o programador nem para a máquina que o executa. O fato de quecat
subsumenull
enocat
explica a inexistência de tais programas. Evite usarcat
com um único argumento se o resultado entrar em um pipeline, mas se for usado apenas para exibir o conteúdo do arquivo no terminal, mesmo a página que eu vinculei admite que esse é um uso útilcat
, portanto, não hesite.Você pode testar o que
cat
é realmente implementado por um loop simples em torno de umanocat
funcionalidade hipotética , chamandocat
com vários nomes de arquivos entre os quais um nome inválido, não na primeira posição: em vez de reclamar imediatamente que esse arquivo não existe,cat
primeiro despeja o precedente arquivos válidos e depois reclama do arquivo inválido (pelo menos é assim que meu gato se comporta).fonte
Sob
zsh
tentativaEu acredito que é a maneira mais curta de imprimir um arquivo. Ele usa 'hidden'
cat
(oumore
se stdout é um terminal), mas o comando usado para impressão é controlado porREADNULLCMD
variável que você pode sobrescrever com segurança diretamente pelo nome do comando ou mesmo por alguma função. Por exemplo, para imprimir arquivos com numeração de linha:fonte
O POSIX define gato como:
Então, acho que concatenar aqui significa ler arquivos em sequência .
fonte
Eu sei que esta é uma questão de pretérito. Tecnicamente, como imprimir o conteúdo de um arquivo
stdout
é uma forma de concatenação,cat
é semanticamente apropriado. Não esqueça queprintf
se destina semanticamente a formatar e imprimir dados. O Bash também fornece sintaxe para redirecionar entrada e saída de arquivos. Uma combinação destes pode produzir o seguinte:fonte
cat file.txt
, pois removerá as novas linhas finais (o$(...)
faz isso).Usando
bash
builtins e evitando a criação de subprocessos:IFS
será aplicado apenas aoread
comando, portanto, não se preocupe com suasIFS
alterações globais .Loop necessário para manipular caracteres nulos (graças a Stéphane Chazelas).
Dessa forma, não é adequado para arquivos grandes porque o conteúdo do arquivo é lido primeiro na variável (portanto, na memória). BTW Eu tentei imprimir 39M arquivo de texto dessa maneira e bash memória uso não excedeu 5M, por isso não tenho certeza sobre este caso.
Também é muito lento e ineficiente da CPU: para o mesmo arquivo de 39M, levou ~ 3 minutos com 100% de uso de núcleo único.
Para arquivos grandes ou binários melhores para usar
cat '/path/to/file'
ou mesmodd if='/path/to/file' bs=1M
se possível.fonte
pv -q
qual Linux pode usarsplice()
e, para alguns tipos de stdin / stdout, melhorará o desempenho.Apenas como demonstração, você pode fazer
fonte