Usando múltiples delimitadores en awk

Resuelto Satish asked hace 12 años • 8 respuestas

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 delimiterpara extraer el campo?

Satish avatar Aug 31 '12 02:08 Satish
Aceptado

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
embedded.kyle avatar Aug 30 '2012 19:08 embedded.kyle

¡Buenas noticias! awkEl 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 -vbandera para establecer una variable. OFSes 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
fedorqui avatar Nov 16 '2014 18:11 fedorqui

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

Stan Lovisa avatar Jun 18 '2020 09:06 Stan Lovisa