Seleccione una columna arbitraria de texto en UNIX

UNIX tiene capacidades de procesamiento de texto maravillosamente poderosas. Existen numerosas formas de resolver el mismo problema. Con frecuencia, por ejemplo, es necesario extraer una sola columna de datos de un archivo de texto o flujo de salida. Esta receta técnica presentará varias soluciones a este problema.


Muchos archivos de datos tienen campos de datos delimitados por un solo carácter como una pestaña o dos puntos. Para extraer el campo de nombre completo de / etc / passwd, el quinto campo delimitado por dos puntos, use:

corte -d: -f 5 / etc / passwd

El comando de corte permite una gran flexibilidad en el corte de datos. En este caso, la -d: dirige el corte para usar un carácter de dos puntos como delimitador. los -f 5 El parámetro indica cortar para extraer solo el quinto campo. El parámetro de campo hace que el corte sea extremadamente flexible. Otros ejemplos son -f 2-5 para extraer los campos 2 a 5, -f 1,3,7 Para extraer los campos primero, tercero y séptimo.

Para extraer un conjunto fijo de columnas, por ejemplo, los números de columna 44 a 49 de una lista larga de directorios (ls -l), use el siguiente comando:

ls -l | corte -c 44-49

En muchos sistemas UNIX, estas columnas representan la fecha de modificación. Al igual que el parámetro -f, el parámetro -c puede aceptar valores alternativos, como -c 5,7,6,8 presentará esas posiciones de carácter en ese orden.

Una de las extracciones de columnas más complicadas implica la presencia de una cantidad variable de espacios en blanco entre campos. Para extraer el campo de id de proceso (segundo) de un listado de procesos (ps -ef), el corte no funcionará. Otro poderoso manipulador de texto en UNIX es awk, que entiende que varios espacios deben contarse como un solo espacio en blanco. Para extraer el pid de un ps -ef, use:

ps -ef | cabeza | awk '{print $ 2}'

Awk es una herramienta increíblemente poderosa, y esta es una aplicación trivial pero útil de ella.