Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

140
Vistas
Pasar datos con Awk como una sola línea y evitar abrir múltiples sockets con tubería

Tengo una pregunta a continuación sobre el análisis de los datos con awk y eso funciona, pero no parece tan eficiente y se puede mejorar en el punto que hice.

Apreciaré cualquier sugerencia y ayuda en esto.

  • Escenario uno:

Datos sin procesar:

 # dmesg | awk '/blk_update_request/{ if ($7 =="sector") print $0}' | head -5 [14740442.054675] blk_update_request: I/O error, dev sde, sector 3618747392 [14740442.055693] blk_update_request: I/O error, dev sde, sector 3618746368 [14740442.056807] blk_update_request: I/O error, dev sde, sector 3618745344 [14740442.057927] blk_update_request: I/O error, dev sde, sector 3618744320 [14740442.059074] blk_update_request: I/O error, dev sde, sector 3618743296

Ensayo:

 # dmesg | awk '/blk_update_request/{ if ($7 =="sector") print $6}'| cut -d, -f1|head -5 sde sde sde sde sde

Nota

Esto funciona bien, pero simplemente para eliminar el punto y coma , estoy usando cut nuevamente, lo que probablemente agrega otro socket como | .

Deseado

¿Se puede ajustar esto con el propio awk, para hacerlo en una sola llamada?

  • Secario2

Datos sin procesar:

 Mar 20 05:15:02 transpire kernel: [15432418.855144] EXT4-fs (dm-13): error count since last fsck: 100 Mar 20 06:16:12 transpire kernel: [15436088.797185] EXT4-fs (dm-12): error count since last fsck: 20 Mar 20 07:17:22 transpire kernel: [15439758.736285] EXT4-fs (dm-15): error count since last fsck: 40 Mar 20 07:17:22 transpire kernel: [15439758.736293] EXT4-fs (dm-14): error count since last fsck: 2 Mar 20 19:48:50 transpire kernel: [15484846.579068] EXT4-fs (dm-11): error count since last fsck: 55 Mar 20 19:48:50 transpire kernel: [15484846.580064] EXT4-fs (dm-10): error count since last fsck: 41 Mar 21 05:16:49 transpire kernel: [15518924.611572] EXT4-fs (dm-13): error count since last fsck: 100 Mar 21 06:17:59 transpire kernel: [15522594.553205] EXT4-fs (dm-12): error count since last fsck: 20 Mar 21 07:19:09 transpire kernel: [15526264.495077] EXT4-fs (dm-14): error count since last fsck: 2 Mar 21 07:19:09 transpire kernel: [15526264.495086] EXT4-fs (dm-15): error count since last fsck: 4

0

 # awk '/dm/{print $8|"sort -u"}' /var/log/messages (dm-10): (dm-11): (dm-12): (dm-13): (dm-14): (dm-15): error enter code here

Ensayo:

 # awk '/dm/{print $8|"sort -u"}' /var/log/messages|tr -d '():'|sed '$ d' dm-10 dm-11 dm-12 dm-13 dm-14 dm-15

Nuevamente, como se indicó anteriormente, no pude descifrar cómo tomar esto en una sola llamada awk, por lo tanto, estoy usando tr para cortar los paréntesis y sed para eliminar el error , ya que viene como una última línea.

Deseado: ¿Se puede hacer esto en una misma llamada awk?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Donde usas dmesg | awk para el primer ejemplo y /var/log/messages como archivo de entrada para el segundo ejemplo, usaré los datos de ejemplo en la pregunta y los leeré de un file de ejemplo

Para la primera parte, puede cambiar el separador de campo a una coma opcional y uno o más espacios.

Luego haga la comparación con el campo n° 7 e imprima el campo n° 6.

 awk -F',?[[:space:]]+' '/blk_update_request/ && $7 =="sector"{ print $6 }' file

Si puede haber más de 1 coma, también puede reemplazar todas las comas en el campo n.° 6 y luego imprimirlo.

 awk '/blk_update_request/ && $7 =="sector"{ gsub(/,+/, "", $6); print $6 }' file

Producción

 sde sde sde sde sde

Para la segunda parte, puede usar gsub para reemplazar los caracteres con una cadena vacía y luego imprimir el campo nr 8.

 awk '{ gsub(/[():]+/, "", $8); print $8 }' file | sort -u

Producción

 dm-10 dm-11 dm-12 dm-13 dm-14 dm-15
over 4 years ago · Santiago Trujillo Denunciar

0

Con sus muestras mostradas, intente seguir las siguientes soluciones awk :

Para que su primera salida obtenga sde , intente seguir el código awk .

 awk -F',|[[:space:]]+' '/blk_update_request/ && $(NF-1)=="sector" {print $(NF-3)}' Input_file

Para que su segunda salida obtenga valores dm , intente seguir el código awk .

 awk -F"[)(]" '!arr[$2]++{print $2 | "sort -n"}' Input_file
over 4 years ago · Santiago Trujillo Denunciar

0

Usaría GNU AWK para la segunda tarea de la siguiente manera, deje que el contenido de file.txt sea

 Mar 20 05:15:02 transpire kernel: [15432418.855144] EXT4-fs (dm-13): error count since last fsck: 100 Mar 20 06:16:12 transpire kernel: [15436088.797185] EXT4-fs (dm-12): error count since last fsck: 20 Mar 20 07:17:22 transpire kernel: [15439758.736285] EXT4-fs (dm-15): error count since last fsck: 40 Mar 20 07:17:22 transpire kernel: [15439758.736293] EXT4-fs (dm-14): error count since last fsck: 2 Mar 20 19:48:50 transpire kernel: [15484846.579068] EXT4-fs (dm-11): error count since last fsck: 55 Mar 20 19:48:50 transpire kernel: [15484846.580064] EXT4-fs (dm-10): error count since last fsck: 41 Mar 21 05:16:49 transpire kernel: [15518924.611572] EXT4-fs (dm-13): error count since last fsck: 100 Mar 21 06:17:59 transpire kernel: [15522594.553205] EXT4-fs (dm-12): error count since last fsck: 20 Mar 21 07:19:09 transpire kernel: [15526264.495077] EXT4-fs (dm-14): error count since last fsck: 2 Mar 21 07:19:09 transpire kernel: [15526264.495086] EXT4-fs (dm-15): error count since last fsck: 4

entonces

 awk 'BEGIN{PROCINFO["sorted_in"]="@ind_str_asc";FPAT="dm-[[:digit:]]+"}NF{arr[$1]}END{for(i in arr){print i}}' file.txt

producción

 dm-10 dm-11 dm-12 dm-13 dm-14 dm-15

Explicación: Le informo a GNU AWK que use índices como una cadena transversal de matriz ascendente y ese campo es dm- seguido de 1 o más dígitos. NF es una variable incorporada que indica el número de campos, cuando se usa como condición es verdadera si al menos 1 campo está presente en la línea. En tal caso, me refiero a que la clave es ese campo de la matriz arr . Esto crea dicha clave en esa matriz, tenga en cuenta que no es necesario proporcionar el valor. Después de procesar todas las líneas, print todas las claves usando for ... in en el orden dictado por PROCINFO["sorted_in"] .

(probado en gawk 4.2.1)

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda