Su sintaxis es de la forma:
awk /patrón/ {acción}
Lee la entrada un renglón a la vez, cada renglón se compara con cada patrón en orden; para cada padrón que concuerde con el renglón se efectúa la acción correspondiente. Si se omite la acción, la acción por defecto consiste en imprimir los renglones que concordaron con el patrón y si se omite el patrón, la parte de la acción se hace en cada renglón de entrada. awk divide cada renglón de entrada en campos, (por defecto) cada campo estará separado por espacios, llama a los campos $1, $2, ..$NF donde NF es una variable cuyo valor es igual al número de campos. Los patrones deben ir rodeados por caracteres / y puede contener dos patrones separados por una coma, en cuyo caso la acción se realizará para aquellas líneas comprendidas entre la primera aparición del primer patrón y la siguiente aparición del segundo patrón.
NR variable igual número de línea actual.
FILENAME nombre del archivo de la entrada.
-F especificamos que carácter queremos que tome como separador de campos.
BEGIN realiza acciones antes de procesar entrada por ejemplo: awk 'BEGIN {FS =":"}' el carácter separador será dos puntos :
awk '{print $1","}' pp agrega un coma (,) al final del primer campo.
# cat pp 3 hola 2 pepe 2 mama 1 www 1 si 1 no # awk '{print $1","}' pp 3, 2, 2, 1, 1, 1,
awk '{print $0","}' pp agrega un coma (,) al final de cada línea.
# awk '{print $0","}' pp 3 hola, 2 pepe, 2 mama, 1 www, 1 si, 1 no,
awk '$1 ~ /1/' ppmuestra todas las líneas cuyo primer campo contenga la cadena 1.
# awk '$1 ~ /1/' pp 1 www 1 si 1 no
awk '$2 ~ /a/' pp muestras todas las líneas cuyo segundo campo contenga la letra a
# awk '$2 ~ /a/' pp 3 hola 2 mama
awk '$2 !~ /a/' pp busca todas las líneas cuyo segundo campo no contenga la letra a
# awk '$2 !~ /a/' pp 2 pepe 1 www 1 si 1 no
awk '/pepe/' ejemplo.txt busca todas las líneas que contenga la cadena pepe es equivalente a ejecutar grep pepe ejemplo.txt
# cat ejemplo.txt mama pepe hola Hola pepe Hola si no Mama www # awk '/pepe/' ejemplo.txt pepe pepe # grep pepe ejemplo.txt pepe pepe
awk '/pepe/,/si/' ejemplo.txt busca todas las líneas existentes entre los patrones pepe y si
# awk '/pepe/,/si/' ejemplo.txt pepe hola Hola pepe Hola si
ifconfig | awk /192/ es equivalente a ejecutar ifconfig | grep 192
# ifconfig | awk /192/ inet addr:192.168.1.6 Bcast:192.168.1.255 Mask:255.255.255.0
ifconfig | awk '/192./ {print $2}'| awk -F: '{print $2}' muestra la dirección IP (si esta empieza por 192.)
# ifconfig | awk '/192./ {print $2}'| awk -F: '{print $2}' 192.168.1.6
awk '{if(length($0) < 12) print}' pp muestra todas las lineas que contengan menos de 12 caracteres.
# cat pp 3 hola 2 pepe 2 mama 1 www 1 si 1 no # awk '{if(length($0) < 12) print}' pp 1 www 1 si 1 no
awk '$2 ~ /si/ {if(length($0) < 12) print}' archivo.txt muestra todas las líneas mayores a 12 caracteres, cuyo segundo campo contenga la cadena si.
# awk '$2 ~ /si/ {if(length($0) < 12) print}' pp 1 si
awk '{ while(++i<=NF) printf (!a[$i]++) ? $i FS : ""; i=split("",a); print "" }' ejemplo2.txt elimina las columnas repetidas (consecutivas o no) en cada una de las filas del archivo ejemplo2.txt
# cat ejemplo2.txt 1 1 1 2 1 2 3 5 5 4 1 2 3 3 # awk '{ while(++i<=NF) printf (!a[$i]++) ? $i FS : ""; i=split("",a); print "" }' ejemplo2.txt 1 2 3 5 4 1 2 3
awk '{ while(++i<=NF) printf (!a[$i]++) ? $i FS : "ñññ"; i=split("",a); print "" }' archivo.txt | grep -v "ñññ" > sinrepetir.txt remplaza donde haya una palabra que se repetida por ñññ esto nos permita luego hacer: grep -v "ññññ" para eliminar esas lineas (elimina las lineas que tienen palabras repetidas).
awk -v IGNORECASE=1 '$1 ~ /Bisuteria/' t2 similar a ejecutar grep -i "^bisuteria" t2
substr(s,m,n) produce la subcadena s que comienza en la posición m y mide n caracteres de largo, si n se omite la subcadena se extiende hasta el final de la línea.
awk '{if(length($0) > 72) print "línea", NR, "muy larga:", substr($0,1,60)}' pepe.txt si alguna de las lineas de pepe.txt contiene más de 72 caracteres desplegará mostrando: línea xxx muy larga: acá mostraría parte de la línea.
# ls -l total 116 -rw-r--r-- 1 root root 51 abr 4 01:56 ejemplo2.txt -rw-r--r-- 1 root root 28 abr 4 01:15 ejemplo2.txt~ -rw-r--r-- 1 root root 45 abr 3 23:35 ejemplo.txt -rw-r--r-- 1 root root 45 abr 3 23:28 ejemplo.txt~ -rwxrwxrwx 1 root root 18959 abr 3 21:41 lista -rw-r--r-- 1 root root 18959 abr 3 22:05 lista-ordenada -rwxrwxrwx 1 root root 21599 abr 3 21:25 lista palabras.txt~ -rwxrwxrwx 1 root root 83 abr 3 21:06 notas.txt -rwxrwxrwx 1 root root 9769 abr 3 21:13 Nuevo Hoja de cálculo de Microsoft Office Excel.xlsx -rw-r--r-- 1 root root 7738 abr 3 22:08 p1 -rw-r--r-- 1 root root 228 abr 3 22:53 pepe.txt -rw-r--r-- 1 root root 228 abr 3 22:51 pepe.txt~ -rw-r--r-- 1 root root 73 abr 3 23:47 pp # ls -l | awk '{if(length($0) > 72) print "línea", NR, "muy larga:", substr($0,1,60)}' línea 10 muy larga: -rwxrwxrwx 1 root root 9769 abr 3 21:13 Nuevo Hoja de cál
awk -F":" '{print $2}' establecemos que el carácter separador será dos puntos : lo cual es equivalente a ejecutar awk 'BEGIN {FS = ":" } {print $2}'
Nota: Recurada que el archivo debe estar en formato UNIX, para ello puedes usar: dos2unix -n pp-dos.txt pp-unix.txt
Un comando relacionado es sed
Para más detalles recomiendo el siguiente manual o ver estos ejemplos de uso del comando awk
hola primero tu tutorial de lo mejor que e encontrado en internet. Quiero hacerte una pregunta sobre un pequeno problema que tengo y quiero solucionarlo con awk. Primero El archivo tiene el siguiente formato:
sp_a.sql
AA select
BB select
CC select
sp_b.sql
sp_c.sql
sp_d.sql
D_aa select
Lo que necesito:
sp_a.sql
AA select
BB select
CC select
sp_d.sql
D_aa select
Eliminando las lineas que
sp_b.sql
sp_c.sql