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''