Sé que cat
puede hacer esto, pero su objetivo principal es concatenar en lugar de solo mostrar el contenido.
También sé sobre less
y more
, pero estoy buscando algo simple ( no un buscapersonas ) que simplemente envíe el contenido de un archivo al terminal y esté hecho específicamente para esto, si existe tal cosa.
cat
concatena.a+b+c
implica realizar 2 adiciones, y la computacióna
no implica agregar nada. Del mismo modo, la ejecucióncat f
no implica concatenar nada (aunque esto sea lo único que podría significar "concatenar una secuencia de un archivo").cat
lee un archivo y escribe otro archivo (secuencia), pero eso no significa que se concatena nada. Si quieres decir quecat f
realmente está funcionandocat - f
, eso simplemente no es cierto.cat
realmente estaba destinado a concatenar (cat file1 file2
concatenará ambos archivos a stdout). Pero su efecto secundario es que, cuando solo tiene 1 archivo como argumento, genera ese único archivo en stdout (donde sea que vaya, ya sea su terminal o redirigido a algo). Por lo tanto, no se creó ningún otro comando solo para generar en stdout, comocat
existía y lo permitió simplemente. Por lo tanto, quieres usarcat
.Respuestas:
El más obvio es
cat
. Pero, también eche un vistazo ahead
ytail
. También hay otros utillities shell para imprimir un archivo línea por línea:sed
,awk
,grep
. Pero esos son para alternar el contenido del archivo o para buscar dentro del archivo.Hice algunas pruebas para estimar cuál es la más efectiva. Corro todo el canal
strace
para ver cuál hizo menos llamadas al sistema. Mi archivo tiene 1275 líneas.awk
: 1355 llamadas al sistemacat
: 51 llamadas al sistemagrep
: 1337 llamadas al sistemahead
: 93 llamadas al sistematail
: 130 llamadas al sistemased
: 1378 llamadas al sistemaComo puede ver, incluso si
cat
fue diseñado para concatenar archivos, es el más rápido y efectivo.sed
,awk
Y elgrep
impreso del archivo línea por línea, por eso tienen más que 1275 llamadas al sistema.fuente
El propósito de
cat
es exactamente eso, leer un archivo y enviarlo a stdout.fuente
cat --help
dice "Concatenar ARCHIVO (s), o entrada estándar, a la salida estándar". No quiero concatenar nadareadlink /dev/fd/1
por ejemplo: deberías poner el nombre de tu tty allí si se ejecuta en un indicador estándar. Entonces, concatenar entrada a salida es lo que está pidiendo hacer.Primero,
cat
escribe en la salida estándar, que no es necesariamente un terminal, incluso sicat
se escribió como parte de un comando en un shell interactivo. Si realmente necesita algo para escribir en el terminal, incluso cuando se redirige la salida estándar, eso no es tan fácil (necesita especificar qué terminal, y puede que ni siquiera haya uno si el comando se ejecuta desde un script), aunque uno podría (ab) usar la salida de error estándar si el comando es simplemente una parte de una tubería. Pero dado que usted indicó quecat
realmente hace el trabajo, supongo que no estaba preguntando sobre tal situación.Si su propósito fuera enviar lo que está escrito a la salida estándar en una tubería, entonces el uso
cat
sería elegible para el Premio de uso inútil de Cat , ya quecat file | pipeline
(donde sepipeline
encuentra cualquier tubería) se puede hacer de manera más eficiente<file pipeline
. Pero de nuevo, de su redacción deduzco que esta no era su intención.Por lo tanto, no está tan claro de qué se preocupa. Si encuentra
cat
demasiado tiempo para escribir, puede definir un alias de uno o dos caracteres (todavía hay algunos nombres que permanecen sin usar en Unix estándar). Sin embargo, si te preocupacat
gastar ciclos inútiles, no deberías.Si hubiera un programa
null
que no toma argumentos y solo copia la entrada estándar a la salida estándar (el objeto neutral para las tuberías), puede hacer lo que quiera<file null
. No existe tal programa, aunque sería fácil de escribir (un programa en C con solo una función de una líneamain
puede hacer el trabajo), pero llamarcat
sin argumentos (ocat -
si desea ser explícito) hace exactamente eso.Si hubo un
nocat
programa que toma exactamente un argumento de nombre de archivo, intenta abrir el archivo, se queja si no puede, y de lo contrario procede a copiar desde el archivo a la salida estándar, entonces eso sería justo lo que está pidiendo. Es solo un poco más difícil de escribir quenull
, el trabajo principal es abrir el archivo, probar y posiblemente quejarse (si es meticuloso, también puede incluir una prueba de que exista exactamente un argumento, y quejarse de lo contrario). Pero nuevamentecat
, ahora provisto de un argumento único, hace exactamente eso, por lo que no hay necesidad de ningúnnocat
programa.Una vez que logró escribir el
nocat
programa, ¿por qué detenerse en un solo argumento? Envolver el código en un buclefor(;*argp!=NULL;++argp)
realmente no es ningún esfuerzo, agrega como máximo un par de instrucciones de máquina al binario y evita tener que quejarse de un número incorrecto de argumentos (lo que ahorra muchas más instrucciones). Voilà una versión primitiva decat
, concatenando archivos. (Para ser honesto, necesita ajustarlo un poco para que sin argumentos se comporte comonull
).Por supuesto, en el
cat
programa real , agregaron algunas campanas y silbatos, porque siempre lo hacen. Pero la esencia es que el aspecto de "concatenación" de loscat
costos realmente no supone ningún esfuerzo, ni para el programador ni para la máquina que lo ejecuta. El hecho de quecat
subsumenull
ynocat
explica la inexistencia de tales programas. Evite usarcat
con un solo argumento si el resultado entra en una tubería, pero si se usa solo para mostrar el contenido del archivo en el terminal, incluso la página a la que enlacé admite que este es un uso útilcat
, así que no lo dude.Puede probar que
cat
realmente se implementa mediante un bucle simple alrededor de unanocat
funcionalidad hipotética , llamandocat
con varios nombres de archivo entre los que se encuentra un nombre no válido, no en la primera posición: en lugar de quejarse de inmediato de que este archivo no existe,cat
primero se elimina el precedente archivos válidos, y luego se queja sobre el archivo no válido (al menos así es como se comporta mi gato).fuente
Bajo
zsh
pruebaCreo que es la forma más corta de imprimir un archivo. Utiliza 'oculto'
cat
(omore
si stdout es un terminal), pero el comando utilizado para imprimir está controlado por unaREADNULLCMD
variable que puede sobrescribir de forma segura directamente por el nombre del comando o incluso por alguna función. Por ejemplo, para imprimir archivos con numeración de línea:fuente
POSIX define gato como:
Así que creo que concatenar aquí significa leer archivos en secuencia .
fuente
Sé que esta es una pregunta en tiempo pasado. Técnicamente, dado que imprimir el contenido de un archivo
stdout
es una forma de concatenación,cat
es semánticamente apropiado. No olvide queprintf
tiene la intención semántica de formatear e imprimir datos. Bash también proporciona sintaxis para redirigir la entrada y la salida de los archivos. Una combinación de estos podría producir esto:fuente
cat file.txt
, ya que eliminará cualquier nueva línea final ($(...)
esto hace esto).Usando
bash
builtins y evitando la creación de subprocesos:IFS
se aplicará solo alread
comando, así que no se preocupe por susIFS
cambios globales .Se requiere bucle para manejar caracteres nulos (gracias a Stéphane Chazelas).
De esta manera, no es adecuado para archivos grandes porque el contenido del archivo se lee primero en la variable (por lo tanto, la memoria). Por cierto, he intentado imprimir un archivo de texto de 39M de esta manera y el uso de la memoria bash no superó los 5M, por lo que no estoy seguro de este caso.
También es muy lento y la CPU es ineficiente: para el mismo archivo de 39M, tomó ~ 3 minutos con el 100% de uso de un solo núcleo.
Para archivos grandes o binarios, mejor usar
cat '/path/to/file'
o inclusodd if='/path/to/file' bs=1M
si es posible.fuente
pv -q
qué en Linux puede usarsplice()
cuál para algunos tipos de stdin / stdout mejorará el rendimiento.Solo como una demostración, puedes hacer
fuente