Búsqueda de sitios web

20 ejemplos awk


20 ejemplos de awk

Existen muchas herramientas de utilidad en el sistema operativo Linux para buscar y generar un informe a partir de datos de texto o archivos. El usuario puede realizar fácilmente muchos tipos de tareas de búsqueda, sustitución y generación de informes utilizando los comandos awk, grep y sed. awk no es solo un comando. Es un lenguaje de secuencias de comandos que se puede usar tanto desde la terminal como desde el archivo awk. Es compatible con la variable, la declaración condicional, la matriz, los bucles, etc., como otros lenguajes de secuencias de comandos. Puede leer el contenido de cualquier archivo línea por línea y separar los campos o columnas en función de un delimitador específico. También admite la expresión regular para buscar una cadena en particular en el contenido de texto o archivo y toma medidas si encuentra alguna coincidencia. En este tutorial se muestra cómo puede usar el comando y el script awk mediante el uso de 20 ejemplos útiles.

Contenido:

  1. awk con printf

  2. awk para dividir en espacios en blanco

  3. awk para cambiar el delimitador

  4. awk con datos delimitados por tabulaciones

  5. awk con datos csv

  6. awk expresión regular

  7. awk mayúsculas y minúsculas expresiones regulares

  8. awk con variable nf (número de campos)

  9. función awk gensub()

  10. awk con la función rand()

  11. awk función definida por el usuario

  12. awk si

  13. variables awk

  14. arreglos extraños

  15. bucle extraño

  16. awk para imprimir la primera columna

  17. awk para imprimir la última columna

  18. awk con grep

  19. awk con el archivo de script bash

  20. awk con sed

Usando awk con printf

La función printf() se usa para formatear cualquier salida en la mayoría de los lenguajes de programación. Esta función se puede usar con el comando awk para generar diferentes tipos de salidas formateadas. Comando awk utilizado principalmente para cualquier archivo de texto. Cree un archivo de texto llamado employee.txt con el contenido que se proporciona a continuación, donde los campos están separados por tabulaciones (' ').

empleado.txt

1001 John sena 40000
1002 Jafar Iqbal   60000
1003 Meher Nigar   30000
1004 Jonny Liver   70000

El siguiente comando awk leerá los datos del archivo employee.txt línea por línea e imprimirá el primer archivo después de formatear. Aquí, “%10s ” significa que la salida tendrá una longitud de 10 caracteres. Si el valor de la salida tiene menos de 10 caracteres, los espacios se agregarán al frente del valor.

$ awk '{ printf  "%10s\n", $1 }' employee.txt

Salida:

Ir a Contenido

awk para dividir en espacios en blanco

El separador de palabras o campos predeterminado para dividir cualquier texto es un espacio en blanco. El comando awk puede tomar valor de texto como entrada de varias maneras. El texto de entrada se pasa desde el comando echo en el siguiente ejemplo. El texto, 'Me gusta programar' se dividirá por separador predeterminado, espacio, y la tercera palabra se imprimirá como salida.

$ echo 'I like programming' | awk '{ print $3 }'

Salida:

Ir a Contenido

awk para cambiar el delimitador

El comando awk se puede usar para cambiar el delimitador de cualquier contenido de archivo. Supongamos que tiene un archivo de texto llamado teléfono.txt con el siguiente contenido donde ':' se usa como separador de campo del contenido del archivo.

teléfono.txt

+123:334:889:778
+880:1855:456:907
+9:7777:38644:808

Ejecute el siguiente comando awk para cambiar el delimitador, ‘:’ por ‘-’ al contenido del archivo, phone.txt.

$ cat phone.txt
$ awk '$1=$1' FS=":" OFS="-" phone.txt

Salida:

Ir a Contenido

awk con datos delimitados por tabulaciones

El comando awk tiene muchas variables integradas que se utilizan para leer el texto de diferentes maneras. Dos de ellos son FS y OFS. FS es un separador de campos de entrada y OFS es un separador de variables de campos de salida. Los usos de estas variables se muestran en esta sección. Cree un archivo separado por tabuladores llamado input.txt con el siguiente contenido para probar los usos de las variables FS y OFS .

Entrada.txt

Client-side   scripting language
Server-side   scripting language
Database  Server
Web  Server

Uso de la variable FS con pestaña

El siguiente comando dividirá cada línea del archivo input.txt según la pestaña (‘ ’) e imprimirá el primer campo de cada línea.

$ awk '{ print $1 }' FS='\t' input.txt

Salida:

Uso de la variable OFS con pestaña

El siguiente comando awk imprimirá los campos 9th y 5th de 'ls -l' salida del comando con tabulador después de imprimir el título de la columna "Nombre" y "Tamaño". Aquí, la variable OFS se utiliza para dar formato a la salida mediante una pestaña.

$ ls -l
$ ls -l | awk -v OFS='\t' 'BEGIN { printf "%s\t%s\n", "Name", "Size"} {print $9,$5}'

Salida:

Ir a Contenido

awk con datos CSV

El contenido de cualquier archivo CSV se puede analizar de varias maneras mediante el comando awk. Cree un archivo CSV llamado "customer.csv" con el siguiente contenido para aplicar el comando awk.

cliente.txt

Id, Name, email, phone
1, Sophia, sophia@yahoo.com, (862) 478-7263
2, Amelia, amelia@gmail.com, (530) 764-8000
3, Emma, emma@hotmail.com, (542) 986-2390

Leyendo un solo campo del archivo CSV

La opción '-F' se usa con el comando awk para establecer el delimitador para dividir cada línea del archivo. El siguiente comando awk imprimirá el campo nombre del archivo customer.csv.

$ cat customer.csv
$ awk -F "," '{print $2}' customer.csv

Leer varios campos combinándolos con otro texto

El siguiente comando imprimirá tres campos de cliente.csv combinando el texto del título, Nombre, Correo electrónico y Teléfono. La primera línea del archivo customer.csv contiene el título de cada campo. La variable NR contiene el número de línea del archivo cuando el comando awk analiza el archivo. En este ejemplo, la variable NR se usa para omitir la primera línea del archivo. La salida mostrará los campos 2nd, 3rd y 4th de todas las líneas excepto la primera línea.

$ awk  -F "," 'NR>1 {print "Name:" $2 ", Email:" $3 ", Phone:" $4}' customer.csv

Salida:

Leyendo un archivo CSV usando un script awk

El script awk se puede ejecutar ejecutando el archivo awk. En este ejemplo se muestra cómo puede crear un archivo awk y ejecutarlo. Cree un archivo llamado awkcsv.awk con el siguiente código. La palabra clave BEGIN se usa en el script para informar al comando awk para que ejecute el script de la parte BEGIN antes de ejecutar otras tareas. Aquí, el separador de campo (FS) se utiliza para definir el delimitador de división y los campos 2nd y 1st se imprimirán de acuerdo con el formato utilizado en función printf().

awkcsv.awk
BEGIN {FS = ","} {printf "%5s(%s)\n", $2,$1}

Ejecute el archivo awkcsv.awk con el contenido del archivo customer.csv mediante el siguiente comando.

$ awk -f awkcsv.awk customer.csv

Salida:

Ir a Contenido

expresión regular awk

La expresión regular es un patrón que se utiliza para buscar cualquier cadena en un texto. Se pueden realizar muy fácilmente diferentes tipos de tareas complicadas de búsqueda y reemplazo utilizando la expresión regular. En esta sección se muestran algunos usos simples de la expresión regular con el comando awk.

Matching character set

El siguiente comando hará coincidir la palabra Fool or bool o Genial con la cadena de entrada e imprimirá si la palabra se encuentra. Aquí, Doll no coincidirá ni se imprimirá.

$ printf "Fool\nCool\nDoll\nbool" | awk '/[FbC]ool/'

Salida:

Cadena de búsqueda al comienzo de la línea

El símbolo '^' se usa en la expresión regular para buscar cualquier patrón al comienzo de la línea. La palabra 'Linux' se buscará al comienzo de cada línea del texto en el siguiente ejemplo. Aquí, dos líneas comienzan con el texto, ‘Linux’ y esas dos líneas se mostrarán en la salida.

$ echo -e "Linux is free to use\n It is an open-source software\nLinuxHint is
 a popular blog site"
| awk '/^Linux/'

Salida:

Cadena de búsqueda al final de la línea

El símbolo ‘$’ se usa en la expresión regular para buscar cualquier patrón al final de cada línea del texto. La palabra 'Script' se busca en el siguiente ejemplo. Aquí, dos líneas contienen la palabra Script al final de la línea.

$ echo -e "PHP Script\nJavaScript\nVisual Programming" | awk '/Script$/'

Salida:

Búsqueda omitiendo un conjunto de caracteres en particular

El símbolo '^' indica el comienzo del texto cuando se usa delante de cualquier patrón de cadena ('/^…/') o antes de cualquier juego de caracteres declarado por < fuerte>^[…]. Si se usa el símbolo ‘^’ dentro del tercer paréntesis, [^…] entonces el conjunto de caracteres definido dentro del paréntesis se omitirá en el momento de la búsqueda. El siguiente comando buscará cualquier palabra que no comience con 'F' pero termine con 'ool'. Cool y bool se imprimirán de acuerdo con el patrón y los datos de texto.

$ printf "Fool\nCool\nDoll\nbool" | awk '/[^F]ool/'

Salida:

Ir a Contenido

regex insensible a mayúsculas y minúsculas

De forma predeterminada, la expresión regular hace una búsqueda que distingue entre mayúsculas y minúsculas cuando busca cualquier patrón en la cadena. La búsqueda que no distingue entre mayúsculas y minúsculas se puede realizar mediante el comando awk con la expresión regular. En el siguiente ejemplo, la función tolower() se utiliza para realizar búsquedas que no distinguen entre mayúsculas y minúsculas. Aquí, la primera palabra de cada línea del texto de entrada se convertirá a minúsculas usando la función tolower() y coincidirá con el patrón de expresión regular. La función toupper() también se puede utilizar para este propósito, en este caso, el patrón debe definirse con todas las letras mayúsculas. El texto definido en el siguiente ejemplo contiene la palabra de búsqueda, ‘web’ en dos líneas que se imprimirán como salida.

$ echo -e "Web Design\nweb development\nFramework" | awk 'tolower($0) ~ /^web/;'

Salida:

Ir a Contenido

awk con variable NF (número de campos)

NF es una variable integrada del comando awk que se usa para contar el número total de campos en cada línea del texto de entrada. Cree cualquier archivo de texto con varias líneas y varias palabras. Aquí se utiliza el archivo input.txt creado en el ejemplo anterior.

Uso de NF desde la línea de comandos

Aquí, el primer comando se usa para mostrar el contenido del archivo input.txt y el segundo comando se usa para mostrar el número total de campos en cada línea del archivo usando NF variable.

$ cat input.txt
$ awk '{print NF}' input.txt

Salida:

Uso de NF en un archivo awk

Cree un archivo awk llamado count.awk con el script que se proporciona a continuación. Cuando este script se ejecute con cualquier dato de texto, cada contenido de línea con campos totales se imprimirá como salida.

cuenta.awk

{print $0}
{print "[Total fields:" NF "]"}

Ejecute el script con el siguiente comando.

$ awk -f count.awk input.txt

Salida:

Ir a Contenido

función awk gensub()

getsub() es una función de sustitución que se utiliza para buscar cadenas según un delimitador particular o un patrón de expresión regular. Esta función está definida en el paquete  ‘gawk’ que no está instalado de forma predeterminada. La sintaxis para esta función se da a continuación. El primer parámetro contiene el patrón de expresión regular o delimitador de búsqueda, el segundo parámetro contiene el texto de reemplazo, el tercer parámetro indica cómo se realizará la búsqueda y el último parámetro contiene el texto en el que se aplicará esta función.

Sintaxis:

gensub(regexp, replacement, how [, target])

Ejecute el siguiente comando para instalar el paquete gawk para usar la función getsub() con el comando awk.

$ sudo apt-get install gawk

Cree un archivo de texto llamado 'salesinfo.txt' con el siguiente contenido para practicar este ejemplo. Aquí, los campos están separados por una pestaña.

info.ventas.txt

Mon  700000
Tue       800000
Wed  750000
Thu       200000
Fri  430000
Sat  820000

Ejecute el siguiente comando para leer los campos numéricos del archivo salesinfo.txt e imprima el total de todas las ventas. Aquí, el tercer parámetro, 'G' indica la búsqueda global. Eso significa que el patrón se buscará en el contenido completo del archivo.

$ awk '{ x=gensub("\t","","G",$2); printf x "+" } END{ print 0 }' salesinfo.txt | bc -l

Salida:

Ir a Contenido

awk con la función rand()

La función rand() se usa para generar cualquier número aleatorio mayor que 0 y menor que 1. Por lo tanto, siempre generará un número fraccionario menor que 1. El siguiente comando generará un número aleatorio fraccionario y multiplicará el valor con 10 para obtener un número mayor que 1. Se imprimirá un número fraccionario con dos dígitos después del punto decimal para aplicar la función printf(). Si ejecuta el siguiente comando varias veces, obtendrá un resultado diferente cada vez.

$ awk 'BEGIN {printf "Number is =%.2f\n" , rand()*10}'

Salida:

Ir a Contenido

función definida por el usuario awk

Todas las funciones que se utilizan en los ejemplos anteriores son funciones integradas. Pero puede declarar una función definida por el usuario en su script awk para realizar cualquier tarea en particular. Suponga que desea crear una función personalizada para calcular el área de un rectángulo. Para realizar esta tarea, cree un archivo llamado 'area.awk' con el siguiente script. En este ejemplo, se declara una función definida por el usuario denominada area() en el script que calcula el área en función de los parámetros de entrada y devuelve el valor del área. El comando getline se utiliza aquí para recibir información del usuario.

área.awk

# Calculate area
function area(height,width){
return height*width
}

# Starts execution
BEGIN {
print "Enter the value of height:"
getline h < "-"
print "Enter the value of width:"
getline w < "-"
print "Area = " area(h,w)
}

Ejecute el script.

$ awk -f area.awk

Salida:

Ir a Contenido

wk si ejemplo

awk admite declaraciones condicionales como otros lenguajes de programación estándar. En esta sección se muestran tres tipos de sentencias if mediante el uso de tres ejemplos. Cree un archivo de texto llamado items.txt con el siguiente contenido.

elementos.txt

HDD  Samsung   $100
Mouse  A4Tech
Printer   HP   $200

Simple ejemplo:

El siguiente comando leerá el contenido del archivo items.txt y verificará el valor del campo 3rd en cada línea. Si el valor está vacío, imprimirá un mensaje de error con el número de línea.

$ awk '{ if ($3 == "") print "Price field is missing in line " NR }'  items.txt

Salida:

ejemplo si-si no:

El siguiente comando imprimirá el precio del artículo si existe el tercer campord en la línea; de lo contrario, imprimirá un mensaje de error.

$ awk '{ if ($3 == "") print "Price field is missing"
else print "item price is " $3 }'
  items.txt

Salida:

ejemplo si-si no-si:

Cuando el siguiente comando se ejecute desde la terminal, tomará la entrada del usuario. El valor de entrada se comparará con cada condición if hasta que la condición sea verdadera. Si alguna condición se cumple, imprimirá la calificación correspondiente. Si el valor de entrada no coincide con ninguna condición, la impresión fallará.

$ awk 'BEGIN { print "Enter the mark:"
getline mark <  "-"
if (mark >= 90) print "A+"
else if( mark >= 80) print "A"
else if( mark >= 70) print "B+"
else print "Fail" }'

Salida:

Ir a Contenido

variables awk

La declaración de la variable awk es similar a la declaración de la variable de shell. Hay una diferencia en la lectura del valor de la variable. El símbolo '$' se usa con el nombre de la variable para que la variable de shell lea el valor. Pero no hay necesidad de usar '$' con la variable awk para leer el valor.

Usando variables simples:

El siguiente comando declarará una variable llamada ‘sitio’ y se le asigna un valor de cadena a esa variable. El valor de la variable se imprime en la declaración siguiente.

$ awk 'BEGIN{ site="LinuxHint.com"; print site}'

Salida:

Uso de una variable para recuperar datos de un archivo

El siguiente comando buscará la palabra ‘Impresora’ en el archivo items.txt. Si alguna línea del archivo comienza con 'Impresora', almacenará el valor de 1st, 2nd y 3rd campos en tres variables. Se imprimirán las variables nombre y precio.

$ awk '/Printer/ { name=$1;brand=$2;price=$3;print "item name=" name;
 print "item price=" price }'
items.txt

Salida:

Ir a Contenido

matrices awk

Tanto las matrices numéricas como las asociadas se pueden usar en awk. La declaración de variables de matriz en awk es la misma que en otros lenguajes de programación. En esta sección se muestran algunos usos de las matrices.

Matriz asociativa:

El índice de la matriz será cualquier cadena para la matriz asociativa. En este ejemplo, se declara e imprime una matriz asociativa de tres elementos.

$ awk 'BEGIN {
books["Web Design"] = "Learning HTML 5";
books["Web Programming"] = "PHP and MySQL"
books["PHP Framework"]="Learning Laravel 5"
printf "%s\n%s\n%s\n", books["Web Design"],books["Web Programming"],
books["PHP Framework"] }'

Salida:

Matriz numérica:

Una matriz numérica de tres elementos se declara e imprime separando tabuladores.

$ awk 'BEGIN {
number[0] = 80;
number[1] = 55;
number[2] = 76;
&nbsp
# print array elements
printf  "Array values: %d\t%d\t%d\n", number[0],number[1],number[2]; }'

Salida:

Ir a Contenido

bucle awk

Awk admite tres tipos de bucles. Los usos de estos bucles se muestran aquí mediante el uso de tres ejemplos.

Mientras bucle:

while loop que se usa en el siguiente comando iterará 5 veces y saldrá del bucle para la instrucción break.

$  awk 'BEGIN { n = 1; while (n <= 10) { if(n > 5) break; print n; n++ } }'

Salida:

En bucle:

El bucle for que se usa en el siguiente comando awk calculará la suma de 1 a 10 e imprimirá el valor.

$ awk 'BEGIN { sum=0; for (n = 1; n <= 10; n++) sum=sum+n; print sum }'

Salida:

Bucle Do-while:

un bucle do-while del siguiente comando imprimirá todos los números pares del 10 al 5.

$ awk 'BEGIN {counter = 10; do { if (counter%2 ==0) print counter; counter-- }
while (counter > 5) }'

Salida:

Ir a Contenido

awk para imprimir la primera columna

La primera columna de cualquier archivo se puede imprimir usando la variable $1 en awk. Pero si el valor de la primera columna contiene varias palabras, solo se imprime la primera palabra de la primera columna. Al usar un delimitador específico, la primera columna se puede imprimir correctamente. Cree un archivo de texto llamado students.txt con el siguiente contenido. Aquí, la primera columna contiene el texto de dos palabras.

Estudiantes.txt

Kaniz Fatema       30<sup>th</sup> batch
Abir Hossain       35<sup>th</sup> batch
John Abraham       40<sup>th</sup> batch

Ejecute el comando awk sin ningún delimitador. Se imprimirá la primera parte de la primera columna.

$ awk '{print $1}' students.txt

Ejecute el comando awk con el siguiente delimitador. Se imprimirá la parte completa de la primera columna.

$ awk -F '\\s\\s' '{print $1}' students.txt

Salida:

Ir a Contenido

awk para imprimir la última columna

La variable $ (NF) se puede utilizar para imprimir la última columna de cualquier archivo. Los siguientes comandos awk imprimirán la última parte y la parte completa de la última columna del archivostudents.txt.

$ awk '{print $(NF)}' students.txt
$ awk -F '\\s\\s' '{print $(NF)}' students.txt

Salida:

Ir a Contenido

awk con grep

grep es otro comando útil de Linux para buscar contenido en un archivo basado en cualquier expresión regular. En el siguiente ejemplo se muestra cómo se pueden usar juntos los comandos awk y grep. El comando grep se usa para buscar información de la identificación del empleado, '1002' del archivo empleado.txt. La salida del comando grep se enviará a awk como datos de entrada. La bonificación del 5 % se contará e imprimirá en función del salario de la identificación del empleado, '1002' por comando awk.

$ cat employee.txt
$ grep '1002' employee.txt | awk -F '\t' '{ print $2 " will get $" ($3*5)/100 " bonus"}'

Salida:

Ir a Contenido

awk con archivo BASH

Al igual que otros comandos de Linux, el comando awk también se puede usar en un script BASH. Cree un archivo de texto llamado clientes.txt con el siguiente contenido. Cada línea de este archivo contiene información sobre cuatro campos. Estos son el ID del cliente, el nombre, la dirección y el número de teléfono móvil, separados por ‘/’.

clientes.txt

AL4934 / Charles M Brunner / 4838  Beeghley Street, Huntsville,Alabama / 256-671-7942
CA5455 / Virginia S Mota / 930  Bassel Street,VALLECITO,California / 415-679-5908
IL4855 / Ann A Neale / 1932  Patterson Fork Road,Chicago,Illinois / 773-550-5107

Cree un archivo bash llamado item_search.bash con el siguiente script. De acuerdo con este script, el valor del estado se tomará del usuario y se buscará en el archivo customers.txt mediante el comando grep y se pasará al comando awk como entrada. El comando Awk leerá los campos 2nd y 4th de cada línea. Si el valor de entrada coincide con cualquier valor de estado del archivo customers.txt, imprimirá el nombre y el número de móvil del cliente; de lo contrario, imprima el mensaje “No se encontró ningún cliente”.

item_search.bash

#!/bin/bash
echo "Enter the state name:"
read state
customers=`grep "$state" customers.txt | awk -F "/" '{print "Customer Name:" $2, ",
Mobile No:" $4}'
`
if [ "$customers" != "" ]; then
echo $customers
else
echo "No customer found"
fi

Ejecute los siguientes comandos para mostrar los resultados.

$ cat customers.txt
$ bash item_search.bash

Salida:

Ir a Contenido

awk con sed

Otra útil herramienta de búsqueda de Linux es sed. Este comando se puede usar tanto para buscar como para reemplazar texto de cualquier archivo. El siguiente ejemplo muestra el uso del comando awk con el comando sed. Aquí, el comando sed buscará todos los nombres de empleados que comiencen con 'J' y pase al comando awk como entrada. awk imprimirá el nombre y la identificación del empleado después de formatear.

$ cat employee.txt
$ sed -n '/J/p' employee.txt | awk -F '\t' '{ printf "%s(%s)\n", $2, $1 }'

Salida:

Ir a Contenido

Conclusión:

Puede usar el comando awk para crear diferentes tipos de informes basados en datos tabulares o delimitados después de filtrar los datos correctamente. Espero que pueda aprender cómo funciona el comando awk después de practicar los ejemplos que se muestran en este tutorial.