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:
-nloop alrededor de cada línea del archivo de entrada, ponga la línea en la variable$_, no imprima automáticamente cada línea-lelimina las nuevas líneas antes del procesamiento y las agrega de nuevo en adelante-amodo autosplit - perl dividirá automáticamente las líneas de entrada en la matriz@F. Se predetermina a la división en espacios en blanco-Fmodificador de autosplit, en este ejemplo se divide en cualquiera/o=-eejecuta 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''