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 la salida anterior, quiero extraer 3 campos (Número 2, 4 y el último *.example.com). Estoy obteniendo 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 está después '='? ¿Cómo uso multiple delimiterpara extraer el campo?
awk
command-line
text-processing
Satish
fuente
fuente

awkera tragar campos cuando estaban en blanco, lo que impedía la numeración de campos. He cambiado-F " "a-F "[ ]"yawkno tragó los campos vacíos más.Respuestas:
El delimitador puede ser una expresión regular.
Produce:
fuente
catno se requiere proceso:awk '...' file. Además, sería más ordenado usar el separador de campo de salida:awk -F'[/=]' -v OFS="\t" '{print $3, $5, $8}'|: ej:awk -F 'this|that|[=/]' '......'(útil para tener palabras / cadenas que separan cosas) (tenga en cuenta que esto mantiene los espacios en los campos entre 2 separadores. Agregar también|[ \t]+puede ser útil, pero puede hacer cosas complicado ... como a menudo hay espacios antes y después de 'this', esto hará que aparezcan 2 campos vacíos adicionales entre los espacios y 'this')¡Buenas noticias!
awkEl separador de campo puede ser una expresión regular. Solo necesitas usar-F"<separator1>|<separator2>|...":Devoluciones:
Aquí:
-F"/|="establece el separador de campo de entrada en/o=. Luego, establece el separador de campo de salida en una pestaña.-vOFS='\t'está usando la-vbandera para establecer una variable.OFSes la variable predeterminada para el Separador de campo de salida y se establece en el carácter de tabulación. La bandera es necesaria porque no hay incorporado para el OFS como-F.{print $3, $5, $NF}imprime los campos tercero, quinto y último en función del separador de campo de entrada.Ver otro ejemplo:
Este archivo tiene dos campos separadores,
#y_. Si queremos imprimir el segundo campo, independientemente de que el separador sea uno u otro, ¡hagamos que ambos sean separadores!Donde los archivos están numerados de la siguiente manera:
fuente
Si su espacio en blanco es consistente, puede usarlo como un delimitador, también en lugar de insertarlo
\tdirectamente, puede configurar el separador de salida y se incluirá automáticamente:fuente
Para un separador de campo de cualquier número a
2través de una5letraao#un espacio, donde el carácter de separación debe repetirse al menos 2 veces y no más de 6 veces, por ejemplo:Estoy seguro de que existen variaciones de esto usando () y parámetros
fuente
Perl one-liner:
Se utilizan estas opciones de línea de comandos:
-nrecorra cada línea del archivo de entrada, coloque la línea en la$_variable, no imprima automáticamente cada línea-lelimina las nuevas líneas antes del procesamiento y las agrega nuevamente-amodo de división automática: Perl dividirá automáticamente las líneas de entrada en la@Fmatriz. Por defecto se divide en espacios en blanco-Fmodificador de división automática, en este ejemplo se divide en cualquiera/o=-eejecuta el código perlPerl está estrechamente relacionado con awk, sin embargo, la
@Fmatriz de división automática comienza en el índice,$F[0]mientras que los campos awk comienzan con $ 1.fuente
Otra es usar la opción -F pero pasarla regex para imprimir el texto entre paréntesis izquierdo y derecho
().El contenido del archivo:
El comando:
resultado:
Usando awk para imprimir el texto entre
[]:Úselo
awk -F'[][]'peroawk -F'[[]]'no funcionará.http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html
fuente
Veo que hay muchas respuestas perfectas en la pizarra, pero también me gustaría subir mi código,
awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'fuente
print $3 " " $5 " " $7se puede imprimir igual queprint $3, $5, $7. Además, no veo la ventaja de usar awk y luego canalizar para sed. En general, awk puede ser suficiente y otras respuestas muestran eso.