El comando AWK es una utensilio versátil de procesamiento de texto en Linux. Filtra y manipula archivos utilizando patrones, condiciones y acciones. Admite una amplia variedad de escenarios, lo que hace que sea sencillo extraer datos específicos de registros, archivos de configuración o cualquier archivo de texto.
Aquí hay algunas formas comunes de filtrar el texto con AWK. Incluyen búsquedas de expresión regulares, selección de secante y campo, filtrado algorítmico y más.
Texto de coincidir con expresiones regulares
Aunque Regex tiene una curva de estudios notoriamente empinada, es la cortaplumas suiza de la manipulación de texto del ejército. Cuando lo usa con herramientas como AWK, puede averiguar patrones, de simples a complejos, en archivos completos en milisegundos.
Comencemos con la sintaxis básica:
awk '/pattern/ {print}' filename`
Las cortes de avance le dicen a AWK que está utilizando una expresión regular, y los aparatos rizados contienen la acto para realizar en una coincidencia. Por ejemplo, puede imprimir todas las entradas de registro que contienen “error” de un archivo de registro con esto:
awk '/error/ {print}' syslog.log
Esa secante toma cada secante que contiene la palabra error, pero Regex le permite ir más allá. Por ejemplo, para encontrar líneas que comienzan con información o advierten, use este comando:
awk '/^(INFO|WARN)/ {print}' syslog.log
Aquí, la tubería | actúa como un cámara, y el careto ^ coincide con el eclosión de una secante.
Lo que me encanta de Regex es que va más allá de las palabras exactas, lo que le permite usar comodines para búsquedas más complejas. Por ejemplo, puede encontrar direcciones de correo electrónico en un archivo de texto con este patrón:
awk '/(a-zA-Z0-9)+@(a-zA-Z0-9)+.(a-zA-Z)+/ {print}' contacts.txt
Este patrón coincide con secuencias de literatura y números, seguido de un símbolo @, más literatura y números, un punto y finalmente más literatura. Si acertadamente no es valentísimo para cada formato de correo electrónico, atrapa los más comunes.
Incluso puede usar el cámara TILDE (~) para una coincidencia más precisa internamente de campos específicos. Este enfoque es muy efectivo para datos estructurados. Por ejemplo, si desea averiguar error solo en el tercer campo de cada secante, puede usar esto:
awk '$3 ~ /ERROR/ {print}' system.log
Este enfoque lo hace más preciso que averiguar toda la secante. Por otra parte, si la sensibilidad de los casos es un problema, simplemente use la función tolower () como esta:
awk 'tolower($0) ~ /error/ {print}' mixed_case.log
Este comando convierte cada secante en minúsculas ayer de averiguar, lo que le permite capturar errores, error, error y cualquier otra capitalización.
Seleccione líneas por número de secante, distancia, recuento de campo o final campo
A veces necesita líneas específicas basadas en su posición o características, no en su contenido. AWK maneja estos escenarios maravillosamente con sus variables incorporadas que filtran líneas por posición o estructura. Estas variables incorporadas incluyen NR, Largura (), NF y $ NF.
Comencemos con la variable NR. Significa el número de registros (o, simplemente el número de secante). AWK lo incrementa para cada secante que lee. Puede usar esto para tomar líneas o rangos específicos.
Para mostrar las primeras 10 líneas de un archivo, use:
awk 'NR largefile.txt
Del mismo modo, para obtener todas las líneas uniformes, use 2:
awk 'NR % 2 == 0 {print}' file.txt
Para rangos, puede combinar múltiples condiciones de NR con el cámara &&, como este:
awk 'NR >= 50 && NR file.txt
Esto imprime las líneas 50 a 100. Incluso puede combinar la función Largura () con AWK cuando se manejo de archivos que tienen un formato inconsistente o cuando desea filtrar líneas vacías.
Por ejemplo, para contar caracteres con la función Long () y luego mostrar solo líneas de más de 80 caracteres, use:
awk 'length($0) > 80 {print}' code.py
Ahora, hablemos de otra variable de uso global, NF, que se refiere al recuento de campo. Usando esta variable, AWK divide automáticamente cada secante en campos en función de un delimitador (por defecto, espacios o pestañas).
Por ejemplo, para archivos CSV o datos estructurados, puede usar la variable NF para contar los campos (columnas). Puede filtrar en función de cuántos campos contiene cada secante:
awk 'NF == 5 {print}' customer_data.csv
Esto mantiene solo líneas con exactamente 5 campos, lo que le ayuda a detectar registros incompletos. Para hacer lo contrario e imprima solo las líneas que no tienen exactamente 5 campos, use el cámara! = En espacio de ==. Por otra parte, para imprimir líneas con al menos 5 campos (columnas), use el cámara> =.
Si acertadamente NF le dice cuántos campos hay, $ NF le da el valía del final campo. La variable $ NF representa el final campo en cada secante, independientemente de cuántos campos hay. Esto es increíblemente útil cuando se manejo de archivos donde el recuento de columnas varía.
Tome este comando:
awk '$NF == "COMPLETED" {print}' task_list.txt
Esto encuentra que todas las líneas terminan con completado, incluso si algunas líneas tienen 3 campos y otras tienen 7.
Incluso puede combinar todas estas condiciones juntas:
awk 'length($0) > 50 && NF >= 4 {print}' mixed_data.txt
Este comando imprime solo las líneas que tienen más de 50 caracteres y contienen al menos 4 campos. Asegura que la salida excluya líneas cortas o incompletas.
Comparar y filtrar títulos de campo algorítmico
AWK es lo suficientemente inteligente como para tratar los campos que contienen números como números reales, no solo texto. Esto significa que puede realizar comparaciones matemáticas sin ninguna función de conversión específico, abriendo un mundo completamente nuevo de posibilidades de filtrado.
Ahora, supongamos que tiene un CSV de puntajes de los estudiantes, y desea devolver solo a los estudiantes que obtuvieron más de 80 marcas. Puedes hacer eso con:
awk -F, '$2 > 80 {print $1, $2}' scores.csv
Aquí, usamos -f, para decirle a AWK que los campos están separados por comas. $ 2 se refiere al segundo campo o columna (el puntaje), y $ 1 es el nombre.
Al trabajar con archivos de texto, los porcentajes pueden causar problemas si el símbolo % se incluye en un campo. Puedes quitarlo con gsub ():
awk '{gsub(/%/, "", $4); if($4 > 75) print}' performance.txt
Este comando elimina el símbolo % del cuarto campo, luego verifica si el número restante excede los 75.
Incluso puede usar múltiples condiciones con operadores lógicos. Por ejemplo, si desea extraer títulos de ventas de un archivo CSV que se encuentran entre $ 500 y $ 2000, ejecute:
awk -F, '$3 > 500 && $3 sales.csv
Puedes combinar condiciones con el || (O) cámara además. Por ejemplo, para encontrar registros donde las ventas son muy altas o muy bajas, use:
awk -F, '$3 > 5000 || $3 sales.csv
Más allá de las comparaciones numéricas, además puede usar múltiples condiciones para hacer coincidir el texto específico, realizar las fechas o excluir registros no deseados.
Incluso puede combinar && y ||. Sin requisa, los paréntesis son esenciales para controlar la razonamiento correctamente. Supongamos que desea encontrar cuentas activas o pendientes, pero solo si su saldo supera los $ 1000. Escribirías:
awk -F, '($2 == "ACTIVE" || $2 == "PENDING") && $3 > 1000' accounts.csv
Sin paréntesis, la precedencia del cámara cambiaría el significado del filtro.
Capturar rangos de líneas entre patrones coincidentes
La mayoría de los usuarios de Linux están familiarizados con el uso de GREP para capturar información específica. Sin requisa, AWK además puede optar un rango de líneas, comenzando desde una secante que coincide con un inicio_pattern y terminando con una secante que coincide con un end_pattern.
La sintaxis es elegantemente simple:
awk '/start_pattern/,/end_pattern/' filename
Esto captura la secante de inicio, todas las líneas intermedias y la secante final. Si desea excluir los marcadores en sí, puede usar un enfoque basado en la bandera como este:
awk '/BEGIN/{flag=1; next} /END/{flag=0} flag' logfile.txt
Por otra parte, además podemos capturar bloques de error completos que comienzan con el texto especificado y finalizan con la futuro secante en blanco.
awk '/ERROR:/,/^$/ {print}' application.log
Aquí, AWK comenzará a imprimir líneas cuando vea una secante que contiene “error:” y continúa hasta que encuentre la primera secante en blanco.
Excluir entradas no deseadas o duplicadas
La destreza de datos a menudo significa eliminar lo que no desea. AWK proporciona formas sencillas de filtrar el ruido y eliminar datos redundantes.
El no cámara (!) Es su utensilio principal para la excepción. Puede colocarlo ayer de cualquier patrón o condición para cambiar el partido, diciéndole a AWK que realice una acto en todas las líneas que no coincidan.
Por ejemplo, supongamos que desea excluir todos los mensajes que contienen depuración del archivo de registro de su aplicación. Usa esto:
awk '!/DEBUG/' application.log
Este comando imprime cada secante desde Application.log a menos que contenga la Word Depug.
Incluso puede combinar esto con condiciones basadas en el campo, como, puede ver todo el tráfico que no provenía de su dirección IP de monitoreo interno.
awk '$1 != "10.0.0.5"' access.log
Del mismo modo, otra gran operación de AWK es filtrar comentarios (líneas que comienzan con #) y las líneas vacías desde un archivo de configuración. Para hacer eso, use:
awk '!/^#/ && NF > 0 {print}' config.ini
Esto omite las líneas que comienzan con # y además elimina las líneas vacías.
Incluso puede eliminar duplicados basados en un campo específico. Por ejemplo, consideremos que tiene un archivo CSV contact_list con tres columnas: ID, nombre y correo electrónico. Para permanecer solo el primer registro para cada dirección de correo electrónico única (en el tercer campo), use:
awk '!seen($3)++ {print}' contact_list.csv
Por otra parte, puede excluir la excepción insensible al caso con la función tolower ():
Texto de reformateo eligiendo columnas específicas
Los datos sin procesar a menudo vienen en una estructura que verdaderamente no necesita, y AWK facilita la reorganización de las cosas más avíos. Puede designar columnas específicas, cambiar su orden o incluso combinarlas en nuevos campos.
Por ejemplo, si solo desea imprimir las columnas segunda y villa desde un archivo, puede usar:
awk -F, '{print $2, $5}' sales.csv
Si desea cambiar el orden de las columnas, cambie $ 5 con $ 2.
Por defecto, AWK separa la salida con espacios, pero puede insertar su propio separador, como un símbolo de tubería.
awk '" $3' data.txt
Cuando se trabaja con archivos CSV, la primera fila es a menudo un encabezado. Puede omitirlo con NR> 1 y reorganizar las columnas para mostrar el correo electrónico seguido del nombre.
awk -F, 'NR > 1 {print $3, "->", $1, $2}' contacts.csv
Incluso puede combinar campos para crear otros nuevos, como unirse al primer y patronímico en un nombre completo ayer de imprimir el correo electrónico.
awk -F, '{print $1 " " $2, $3}' contacts.csv
Finalmente, si desea que la salida se vea más clara, puede anexar su propio encabezado ayer de los datos utilizando un liga de inicio.
awk 'BEGIN {print "Name,Email"} {print $1 "," $2}' data.txt
Estos simples ejemplos son suficientes para comenzar a reformatear el texto en un diseño que se adapte mejor a sus micción.
Recuerde, AWK se destaca en el procesamiento de texto estructurado, cualquier cosa con patrones consistentes o separaciones de campo. Cuanto más regular sea su formato de datos, más poderoso Awk se vuelve. Y cuando combina estas técnicas de filtrado con otras herramientas de Linux a través de tuberías, crea flujos de trabajo de procesamiento de texto increíblemente eficientes.






