Cómo dividir archivos de texto grandes en archivos más pequeños en Linux

Linux tiene varias utilidades para dividir archivos grandes en archivos pequeños. Split y csplit son dos de los comandos populares que se utilizan para este propósito. Estas utilidades ayudarán a dividir los archivos de registro grandes e incluso los archivos de almacenamiento para convertirlos en un tamaño más pequeño. Esto hará que sea conveniente dividir archivos grandes en tamaños más pequeños para que quepan en dispositivos de almacenamiento de medios más pequeños, como USB, para cumplir con nuestro propósito. Con esta técnica, incluso podemos acelerar las transferencias de archivos de red, porque las transferencias paralelas de archivos pequeños suelen ser más rápidas.

En este tutorial, explicaré más sobre cómo usar estas utilidades split y csplit para desglosar archivos grandes en Linux.

Separar

Para dividir archivos grandes en archivos más pequeños, podemos usar esta utilidad de comando en Linux.

Syntax

split [options] filename prefix

Puede reemplazar el nombre del archivo con el nombre del archivo grande que desea dividir. Y “prefijo” con el nombre que desea dar a los pequeños archivos de salida. Puedes excluir [options]o reemplácelo con cualquiera de los siguientes:

-a –suffix-length=N use suffixes of length N (default 2)
-b –bytes=SIZE put SIZE bytes per output file
-C –line-bytes=SIZE put at most SIZE bytes of lines per output file
-d –numeric-suffixes use numeric suffixes instead of alphabetic
-l –lines=NUMBER put NUMBER lines per output file

El comando de división le dará a cada archivo de salida que cree el prefijo de nombre con una extensión tachonada al final que indica su orden. De forma predeterminada, el comando split agrega aa al primer archivo de salida, siguiendo el alfabeto hasta zz para archivos posteriores. De forma predeterminada, la mayoría de los sistemas utilizan x como prefijo.

Ejemplos divididos

El comando Dividir divide el archivo en n líneas por archivo y nombra los archivos como PREFIXaa, PREFIXab, PREFIXac, y así. Por defecto, el PREFIJO es x , y el número de líneas es 1000 líneas por archivo.

Dividir un archivo en varias partes por uso predeterminado

Tengo mi archivo de registro, es decir, el registro del sistema con 1099 líneas, veamos el estado de mi archivo de registro después de dividirlo con este comando.

# cat systemlog | wc -l
1099
# split systemlog
# ll
total 160
-rw-rw-r-- 1 root root 76294 Mar 25 12:02 systemlog
-rw-r--r-- 1 root root 68251 Mar 25 12:07 xaa
-rw-r--r-- 1 root root 8043 Mar 25 12:07 xab
# cat xaa | wc -l
1000
# cat xab | wc -l
99

El comando divide el archivo de registro en dos archivos xaa and xab, con el primero que tiene 1000 líneas y vuelca el sobrante en el segundo archivo.

Divida el archivo, según el número de líneas

Podemos dividir el archivo en varias partes según el número de líneas usando la opción -l. Aquí, estoy dividiendo mi system log archivo con 1099 líneas en archivos más pequeños con 200 líneas cada uno. Veamos los comandos para el mismo:

# split -l 200 systemlog
# ll
total 172
-rw-rw-r-- 1 root root 76294 Mar 25 12:02 systemlog
-rw-r--r-- 1 root root 14369 Mar 25 12:16 xaa
-rw-r--r-- 1 root root 12795 Mar 25 12:16 xab
-rw-r--r-- 1 root root 13566 Mar 25 12:16 xac
-rw-r--r-- 1 root root 13681 Mar 25 12:16 xad
-rw-r--r-- 1 root root 13840 Mar 25 12:16 xae
-rw-r--r-- 1 root root 8043 Mar 25 12:16 xaf
# cat xaa | wc -l; cat xab | wc -l; cat xac | wc -l; cat xad | wc -l; cat xae | wc -l; cat xaf | wc -l
200
200
200
200
200
99

Puede ver que el comando ha dividido mi archivo de registro en cinco archivos más pequeños con 200 líneas cada uno y el último con las sobras.

Divida un archivo grande en archivos de 500 MB

Puede usar la opción -b para especificar el límite de tamaño requerido para dividir los archivos. Por favor, vea este comando que utilicé para dividir mi 1GB Apache log archivo en dos archivos de 500 MB cada uno.

# split -b 500MB httpd.log
# ll -lh
total 1.9G
-rw-r--r-- 1 root root 954M Mar 25 12:35 httpd.log
-rw-r--r-- 1 root root 477M Mar 25 12:38 xaa
-rw-r--r-- 1 root root 477M Mar 25 12:38 xab

Divida un archivo grande en archivos de 200 MB con el prefijo dado

Puede usar la opción -b para especificar el tamaño de archivo de 200M y el prefijo requerido como segundo argumento. Por favor, vea el comando que usé para dividir mi 1GB Apache iniciar sesión en archivos de 200 MB con un prefijo llamado split.log debajo:

# split -b 200M httpd.log split.log
# ll -lh
total 1.9G
-rw-r--r-- 1 root root 954M Mar 25 12:35 httpd.log
-rw-r--r-- 1 root root 200M Mar 25 12:52 split.logaa
-rw-r--r-- 1 root root 200M Mar 25 12:52 split.logab
-rw-r--r-- 1 root root 200M Mar 25 12:52 split.logac
-rw-r--r-- 1 root root 200M Mar 25 12:52 split.logad
-rw-r--r-- 1 root root 154M Mar 25 12:52 split.logae

En esto example, puede ver que mis archivos de registro están divididos en archivos de 200 MB con mi prefijo requerido.

Divida el archivo y asígnele un nombre con números

Puedes usar la opción -d para nombrar los archivos con sufijos numéricos como 00, 01, 02 .. y así sucesivamente, en lugar de aa, ab, ac. Por favor, vea el comando que usé para dividir mi 1GB Apache inicie sesión en archivos de 200 MB con un prefijo llamado log y agregue números al sufijo usando la opción -d en lugar de los alfabetos siguientes:

# split -d -b 200M httpd.log log
# ll -lh
total 1.9G
-rw-r--r-- 1 root root 954M Mar 25 12:35 httpd.log
-rw-r--r-- 1 root root 200M Mar 25 12:58 log00
-rw-r--r-- 1 root root 200M Mar 25 12:58 log01
-rw-r--r-- 1 root root 200M Mar 25 12:58 log02
-rw-r--r-- 1 root root 200M Mar 25 12:58 log03
-rw-r--r-- 1 root root 154M Mar 25 12:58 log04

Puede ver la página del manual del comando split usando el comando man split para ver más información.

Csplit

Csplit es otra utilidad de comando que divide archivos individuales en varios archivos determinados por líneas de contexto.

Sintaxis

csplit [option]... filename pattern.

Los archivos creados por csplit normalmente tienen nombres de la forma

xxnumber
donde número es un número decimal de dos dígitos que comienza en cero y se incrementa en uno por cada nuevo archivo que crea csplit.

csplit también muestra el tamaño, en bytes, de cada archivo que crea como salida.

Options
-A, uses uppercase letters in place of numbers in the number portion of output file names like xxAA, xxAB, and so on.

-a, uses lowercase letters in place of numbers in the number portion of output file names like xxaa, xxab, and so on.

-f prefix, specifies a prefix to use in place of the default xx when naming files. If prefix causes a file name longer than NAME_MAX bytes an error occurs and csplit exits without creating any files.

-k, leaves all created files intact. Normally, when an error occurs, csplit removes files that it has created.

-n number, specifies the number of digits in the number portion of created file names.

-s, suppresses the display of file sizes.

Ejemplos de Csplit

De forma predeterminada, los archivos que csplit produce en la salida tienen ‘xx’ como prefijo y los números producidos en la salida son el recuento de bytes de los archivos que produjo el comando.

Dividir archivos según el número de líneas

Tengo un archivo que contiene 8 líneas con los nombres de dominio, y mi requisito es dividir ese archivo en la cuarta línea, luego esto se puede hacer pasando ‘4’ como un argumento de línea de comando después del comando y el nombre del archivo.

For example, in our case, domainslist  contains the following information: # cat domainslist domain1.com domain2.com domain3.com domain4.com domain5.com domain6.com domain7.com domain8.com

Al pasar 4 como argumento de línea de comandos, este comando divide nuestro domainslist archivo en la cuarta línea. Los números producidos en la salida son el recuento de bytes de los archivos que produjo el comando. Aparentemente, se produjeron dos archivos en la salida, a saber, xx00 y xx01.

# csplit domainslist 4
36
60
# ll
total 20
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist
-rw-r--r-- 1 root root 36 Mar 25 14:08 xx00
-rw-r--r-- 1 root root 60 Mar 25 14:08 xx01

# cat xx00
domain1.com
domain2.com
domain3.com
# cat xx01
domain4.com
domain5.com
domain6.com

Dividir archivos usando expresiones regulares

Podemos usar expresiones regulares con el comando csplit. Para example, en el caso anterior, si desea que el comando repita el patrón una vez más, puede hacerlo usando el siguiente comando:

# csplit domainslist 4 {1}
36
48
12
# ll
total 24
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist
-rw-r--r-- 1 root root 36 Mar 25 15:13 xx00
-rw-r--r-- 1 root root 48 Mar 25 15:13 xx01
-rw-r--r-- 1 root root 12 Mar 25 15:13 xx02

En este caso, podemos obtener tres archivos de salida.

# cat xx00
domain1.com
domain2.com
domain3.com
# cat xx01
domain4.com
domain5.com
domain6.com
domain7.com
# cat xx02
domain8.com

Puedes usar el asterisk wildcard {*} para decirle a csplit que repita su división tantas veces como sea posible.

Dividir archivos con el prefijo dado

De forma predeterminada, csplit divide archivos y genera los archivos de salida para que tengan xx como prefijo. Sin embargo, si lo desea, puede cambiar ese prefijo predeterminado usando el option -f en la línea de comando con un prefijo requerido.

Para example, el siguiente comando producirá archivos con ‘dominio’ como prefijo.

# csplit domainslist 4 {1} -f domain
36
48
12
# ll
total 24
-rw-r--r-- 1 root root 36 Mar 25 15:16 domain00
-rw-r--r-- 1 root root 48 Mar 25 15:16 domain01
-rw-r--r-- 1 root root 12 Mar 25 15:16 domain02
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist

Divida un archivo suprimiendo una línea que coincida con el patrón de entrada

Este comando csplit proporciona una opción para suprimir las líneas que coinciden con el patrón de entrada. La opción en cuestión es --suppress-matched.

Para example, el siguiente comando divide nuestro archivo en la línea 4 (xx00 contendrá hasta la línea 3, mientras que xx11 contendrá el resto de las líneas excluyendo la línea 4).

# csplit --suppress-matched domainslist 4
36
48
# ll
total 20
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist
-rw-r--r-- 1 root root 36 Mar 25 15:27 xx00
-rw-r--r-- 1 root root 48 Mar 25 15:27 xx01
# cat xx00
domain1.com
domain2.com
domain3.com
# cat xx01
domain5.com
domain6.com
domain7.com

Personalice la cantidad de dígitos en los nombres de los archivos de salida

De forma predeterminada, la cantidad de dígitos que siguen al prefijo en el nombre del archivo de salida es 2. Podemos usar esto option -n para personalizar el número de dígitos que siguen al prefijo en los nombres de los archivos de salida. Para example, si desea tener nombres como xx001, puede usar la opción de línea de comando que requiere el número de entrada que significa el número de dígitos como -n 3 como a continuación:

# csplit -n 3 domainslist 4
36
60
# ll
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist
-rw-r--r-- 1 root root 36 Mar 25 15:34 xx000
-rw-r--r-- 1 root root 60 Mar 25 15:34 xx001

Obligar a csplit a guardar el archivo de salida en caso de error

De forma predeterminada, csplit elimina los archivos de salida creados en caso de cualquier situación de error. Sin embargo, si desea guardar este archivo de salida a la fuerza utilizando el -k option en el comando. Por favor, chequee esto example para ver la diferencia en la ejecución de este comando con y sin la opción -k.

De forma predeterminada, csplit elimina los archivos de salida creados en caso de cualquier situación de error. Sin embargo, podemos guardar forzosamente este archivo de salida usando la opción ‘-k’ en el comando. Por favor, chequee esto example para ver la diferencia en la ejecución de este comando con y sin la opción -k. En esta primera example, el comando está destinado a dividir nuestro archivo ‘domainslist’ en la línea 3 y repetir el comando dos veces así, lo que significa que también debe dividir el segundo archivo en la línea 3 y repetirlo una vez más. Pero dado que nuestro archivo fuente tiene solo ocho líneas, después de la primera división se repite una vez pero no puede iterar dos veces debido al rango insuficiente. Por lo tanto, no se generan archivos de salida debido a este error.

# csplit domainslist 3 {2}
24
36
36
csplit: ‘3’: line number out of range on repetition 2
# ll
total 12
drwxr-xr-x 2 root root 4096 Mar 25 15:41 ./
drwxr-xr-x 4 root root 4096 Mar 25 14:07 ../
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist

Pero cuando ejecutamos el mismo comando con esta opción -k, los archivos de salida no fueron eliminados. Vea el resultado a continuación:

# csplit -k domainslist 3 {2}
24
36
36
csplit: ‘3’: line number out of range on repetition 2
# ll
total 24
-rw-r--r-- 1 root root 96 Mar 25 14:08 domainslist
-rw-r--r-- 1 root root 24 Mar 25 15:41 xx00
-rw-r--r-- 1 root root 36 Mar 25 15:41 xx01
-rw-r--r-- 1 root root 36 Mar 25 15:41 xx02
# cat xx00
domain1.com
domain2.com
# cat xx01
domain3.com
domain4.com
domain5.com
# cat xx02
domain6.com
domain7.com
domain8.com

Puede consultar la página de manual de esta herramienta usando man csplit para obtener más información sobre esto.

Consulte también : Cómo usar el comando Truncar en Linux

Terminando

Es posible que estas utilidades de línea de comandos no sean necesarias para un usuario de Linux a diario, pero esta es una de las utilidades importantes que le serán de utilidad en la administración de su servidor. Espero que este artículo explique todas las opciones y usos básicos de estas herramientas. Publique sus valiosos comentarios y sugerencias al respecto.