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 delimiter
para extraer el campo?
awk
command-line
text-processing
Satish
fuente
fuente
awk
era tragar campos cuando estaban en blanco, lo que impedía la numeración de campos. He cambiado-F " "
a-F "[ ]"
yawk
no tragó los campos vacíos más.Respuestas:
El delimitador puede ser una expresión regular.
Produce:
fuente
cat
no 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!
awk
El 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-v
bandera para establecer una variable.OFS
es 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
\t
directamente, puede configurar el separador de salida y se incluirá automáticamente:fuente
Para un separador de campo de cualquier número a
2
través de una5
letraa
o#
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:
-n
recorra cada línea del archivo de entrada, coloque la línea en la$_
variable, no imprima automáticamente cada línea-l
elimina las nuevas líneas antes del procesamiento y las agrega nuevamente-a
modo de división automática: Perl dividirá automáticamente las líneas de entrada en la@F
matriz. Por defecto se divide en espacios en blanco-F
modificador de división automática, en este ejemplo se divide en cualquiera/
o=
-e
ejecuta el código perlPerl está estrechamente relacionado con awk, sin embargo, la
@F
matriz 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 " " $7
se 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.