Usando múltiples delimitadores en awk
Tengo un archivo que contiene las siguientes líneas:
/logs/tc0001/tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com
En el resultado anterior quiero extraer 3 campos (Número 2, 4 y el último *.example.com
). Obtengo el siguiente resultado:
cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001 tomcat7.1
tc0001 tomcat7.2
tc0001 tomcat7.5
¿Cómo extraigo también el último campo con el nombre de dominio que sigue '='
? ¿ Cómo lo uso multiple delimiter
para extraer el campo?
El delimitador puede ser una expresión regular.
awk -F'[/=]' '{print $3 "\t" $5 "\t" $8}' file
Produce:
tc0001 tomcat7.1 demo.example.com
tc0001 tomcat7.2 quest.example.com
tc0001 tomcat7.5 www.example.com
¡Buenas noticias! awk
El separador de campo puede ser una expresión regular. Sólo necesitas usar -F"<separator1>|<separator2>|..."
:
awk -F"/|=" -vOFS='\t' '{print $3, $5, $NF}' file
Devoluciones:
tc0001 tomcat7.1 demo.example.com
tc0001 tomcat7.2 quest.example.com
tc0001 tomcat7.5 www.example.com
Aquí:
-F"/|="
establece el separador de campo de entrada en/
o=
.-vOFS='\t'
está utilizando la-v
bandera para establecer una variable.OFS
es la variable predeterminada para el separador de campo de salida y está configurada en el carácter de tabulación. La bandera es necesaria porque no hay ninguna incorporada para OFS como-F
.{print $3, $5, $NF}
imprime el tercer, quinto y último campo según el separador de campo de entrada.
Vea otro ejemplo:
$ cat file
hello#how_are_you
i#am_very#well_thank#you
Este archivo tiene dos separadores de campos #
y _
. Si queremos imprimir el segundo campo independientemente de que el separador sea uno u otro, ¡hagamos que ambos sean separadores!
$ awk -F"#|_" '{print $2}' file
how
am
Donde los expedientes están numerados de la siguiente manera:
hello#how_are_you i#am_very#well_thank#you
^^^^^ ^^^ ^^^ ^^^ ^ ^^ ^^^^ ^^^^ ^^^^^ ^^^
1 2 3 4 1 2 3 4 5 6
Otra es usar la opción -F pero pasarle expresiones regulares para imprimir el texto entre paréntesis izquierdo o derecho ()
.
El contenido del archivo:
528(smbw)
529(smbt)
530(smbn)
10115(smbs)
El comando:
awk -F"[()]" '{print $2}' filename
resultado:
smbw
smbt
smbn
smbs
Usando awk para simplemente imprimir el texto entre []
:
Úselo awk -F'[][]'
pero awk -F'[[]]'
no funcionará.
http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html