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.
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 3618743296Ensayo:
# dmesg | awk '/blk_update_request/{ if ($7 =="sector") print $6}'| cut -d, -f1|head -5 sde sde sde sde sde Esto funciona bien, pero simplemente para eliminar el punto y coma , estoy usando cut nuevamente, lo que probablemente agrega otro socket como | .
¿Se puede ajustar esto con el propio awk, para hacerlo en una sola llamada?
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: 40
# awk '/dm/{print $8|"sort -u"}' /var/log/messages (dm-10): (dm-11): (dm-12): (dm-13): (dm-14): (dm-15): error enter code hereEnsayo:
# 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?
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 }' fileSi 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 }' fileProducción
sde sde sde sde sdePara 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 -uProducción
dm-10 dm-11 dm-12 dm-13 dm-14 dm-15Con 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_fileUsarí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: 4entonces
awk 'BEGIN{PROCINFO["sorted_in"]="@ind_str_asc";FPAT="dm-[[:digit:]]+"}NF{arr[$1]}END{for(i in arr){print i}}' file.txtproducció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)