romero print mayor filtrar examples linux awk

linux - print - awk syntax



Delimitador múltiple AWK (6)

¡Buenas noticias! awk field separator puede ser una expresión regular. Solo necesita usar -F"<separator1>|<separator2>|..." :

awk -F"/|=" ''{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 = . Luego, establece el separador del campo de salida en una pestaña.

  • {print $3, $5, $NF} imprime los campos 3ro, 5to y último basados ​​en el separador del campo de entrada.

Ver 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 si el separador es uno u otro, ¡hagamos que ambos sean separadores!

$ awk -F"#|_" ''{print $2}'' file how am

Donde los archivos 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

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 ). Obtengo el siguiente resultado:

cat file | awk -F''/'' ''{print $3 "/t" $5}'' tc0001 tomcat7.1 tc0001 tomcat7.2 tc0001 tomcat7.5

¿Cómo también extraigo el último campo con el nombre de dominio que está después de ''='' ? ¿Cómo uso el 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


Para un separador de campo de cualquier número 2 a 5 o letra a o # 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:

awk -F''[2-5a# ]{2,6}'' ...

Estoy seguro de que existen variaciones de esto usando () y parámetros


Perl one-liner:

perl -F''/[//=]/'' -lane ''print "$F[2]/t$F[4]/t$F[7]"'' file

Estas opciones de línea de comando se usan:

  • -n loop alrededor de cada línea del archivo de entrada, ponga 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 de nuevo en adelante

  • -a modo autosplit - perl dividirá automáticamente las líneas de entrada en la matriz @F . Se predetermina a la división en espacios en blanco

  • -F modificador de autosplit, en este ejemplo se divide en cualquiera / o =

  • -e ejecuta el código perl

Perl está estrechamente relacionado con awk, sin embargo, la matriz @F autosplit comienza en el índice $F[0] mientras que los campos awk comienzan con $ 1.


Si su espacio en blanco es consistente, podría usarlo como delimitador, también en lugar de insertar /t directamente, puede configurar el separador de salida y se incluirá automáticamente:

< file awk -v OFS=''/t'' -v FS=''[/ ]'' ''{print $3, $5, $NF}''


Veo que hay muchas respuestas perfectas en la pizarra, pero aún así me gustaría subir mi código también,

awk -F"/" ''{print $3 " " $5 " " $7}'' sam | sed ''s/ cat.* =//g''