Sé que catpuede hacer esto, pero su objetivo principal es concatenar en lugar de solo mostrar el contenido.
También sé sobre lessy 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.

catconcatena.a+b+cimplica realizar 2 adiciones, y la computaciónano implica agregar nada. Del mismo modo, la ejecucióncat fno implica concatenar nada (aunque esto sea lo único que podría significar "concatenar una secuencia de un archivo").catlee un archivo y escribe otro archivo (secuencia), pero eso no significa que se concatena nada. Si quieres decir quecat frealmente está funcionandocat - f, eso simplemente no es cierto.catrealmente estaba destinado a concatenar (cat file1 file2concatenará 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, comocatexistía y lo permitió simplemente. Por lo tanto, quieres usarcat.Respuestas:
El más obvio es
cat. Pero, también eche un vistazo aheadytail. 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
stracepara 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
catfue diseñado para concatenar archivos, es el más rápido y efectivo.sed,awkY elgrepimpreso del archivo línea por línea, por eso tienen más que 1275 llamadas al sistema.fuente
El propósito de
cates exactamente eso, leer un archivo y enviarlo a stdout.fuente
cat --helpdice "Concatenar ARCHIVO (s), o entrada estándar, a la salida estándar". No quiero concatenar nadareadlink /dev/fd/1por 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,
catescribe en la salida estándar, que no es necesariamente un terminal, incluso sicatse 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ó quecatrealmente 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
catsería elegible para el Premio de uso inútil de Cat , ya quecat file | pipeline(donde sepipelineencuentra 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
catdemasiado 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 preocupacatgastar ciclos inútiles, no deberías.Si hubiera un programa
nullque 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íneamainpuede hacer el trabajo), pero llamarcatsin argumentos (ocat -si desea ser explícito) hace exactamente eso.Si hubo un
nocatprograma 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únnocatprograma.Una vez que logró escribir el
nocatprograma, ¿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
catprograma real , agregaron algunas campanas y silbatos, porque siempre lo hacen. Pero la esencia es que el aspecto de "concatenación" de loscatcostos realmente no supone ningún esfuerzo, ni para el programador ni para la máquina que lo ejecuta. El hecho de quecatsubsumenullynocatexplica la inexistencia de tales programas. Evite usarcatcon 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
catrealmente se implementa mediante un bucle simple alrededor de unanocatfuncionalidad hipotética , llamandocatcon 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,catprimero 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
zshpruebaCreo que es la forma más corta de imprimir un archivo. Utiliza 'oculto'
cat(omoresi stdout es un terminal), pero el comando utilizado para imprimir está controlado por unaREADNULLCMDvariable 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
stdoutes una forma de concatenación,cates semánticamente apropiado. No olvide queprintftiene 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
bashbuiltins y evitando la creación de subprocesos:IFSse aplicará solo alreadcomando, así que no se preocupe por susIFScambios 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=1Msi es posible.fuente
pv -qqué en Linux puede usarsplice()cuál para algunos tipos de stdin / stdout mejorará el rendimiento.Solo como una demostración, puedes hacer
fuente