我有一個關于決議資料的問題awk,它有效,但看起來效率不高,可以在我提出這些問題上加以改進。
將不勝感激任何建議和幫助。
- 場景一:
原始資料:
# 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
審判:
# dmesg | awk '/blk_update_request/{ if ($7 =="sector") print $6}'| cut -d, -f1|head -5
sde
sde
sde
sde
sde
筆記
這很好用,但是為了簡單地洗掉分號,,我cut再次使用它 prolly 添加了另一個套接字作為|.
期望的
這可以用 awk 本身進行調整,以便在一次呼叫中完成。
- Secario2
原始資料:
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
審判:
# 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
同樣,如上所述,我無法想出將其納入單個 awk 呼叫,因此我使用tr砍掉括號并sed洗掉error,因為這是最后一行。
期望:這可以在同一個 awk 呼叫中完成嗎?
uj5u.com熱心網友回復:
對于您顯示的示例,請嘗試以下awk解決方案:
要獲得第一個輸出,sde請嘗試以下awk代碼。
awk -F',|[[:space:]] ' '/blk_update_request/ && $(NF-1)=="sector" {print $(NF-3)}' Input_file
對于您的第二個輸出來獲取dm值,請嘗試以下awk代碼。
awk -F"[)(]" '!arr[$2] {print $2 | "sort -n"}' Input_file
uj5u.com熱心網友回復:
在您dmesg | awk用于第一個示例和/var/log/messages作為第二個示例的輸入檔案的地方,我將使用問題中的示例資料并從示例中讀取file
對于第一部分,您可以將欄位分隔符更改為可選的逗號和 1 個或多個空格。
然后與欄位 nr 7 進行比較并列印欄位 nr 6。
awk -F',?[[:space:]] ' '/blk_update_request/ && $7 =="sector"{ print $6 }' file
如果可以有超過 1 個逗號,您也可以替換欄位 nr 6 中的所有逗號,然后列印。
awk '/blk_update_request/ && $7 =="sector"{ gsub(/, /, "", $6); print $6 }' file
輸出
sde
sde
sde
sde
sde
對于第二部分,您可以使用 gsub 將字符替換為空字串,然后列印欄位 nr 8。
awk '{ gsub(/[():] /, "", $8); print $8 }' file | sort -u
輸出
dm-10
dm-11
dm-12
dm-13
dm-14
dm-15
uj5u.com熱心網友回復:
我會使用 GNUAWK來完成第二個任務,讓file.txt內容成為
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
然后
awk 'BEGIN{PROCINFO["sorted_in"]="@ind_str_asc";FPAT="dm-[[:digit:]] "}NF{arr[$1]}END{for(i in arr){print i}}' file.txt
輸出
dm-10
dm-11
dm-12
dm-13
dm-14
dm-15
說明:我通知 GNUAWK使用索引作為字串升序陣列遍歷,并且該欄位dm-后跟 1 個或多個數字。NF是表示欄位數的內置變數,當用作條件時,如果行中至少存在 1 個欄位,則為真。在這種情況下,我確實指的是 key 是 array 的那個欄位arr。這確實在該陣列中創建了這樣的鍵,請注意不必給出值。處理完所有行后,我使用...按 .指示的順序print使用所有鍵。forinPROCINFO["sorted_in"]
(在 gawk 4.2.1 中測驗)
uj5u.com熱心網友回復:
場景一:
$ awk -F'[ ,] ' '/blk_update_request/ && ($7=="sector"){print $6}' file
sde
sde
sde
sde
sde
場景二:
如果您只想要唯一值,那么:
$ awk -F'[()]' '!seen[$2] {print $2}' file
dm-13
dm-12
dm-15
dm-14
dm-11
dm-10
但如果你想讓它們排序,那么最有效(便攜和健壯)的方法是:
$ awk -F'[()]' '{print $2}' file | sort -t'-' -u -k1,1 -k2,2n
dm-10
dm-11
dm-12
dm-13
dm-14
dm-15
請注意,以上內容是在數字部分進行數字排序,因此如果您有除dm和/或單個或三重數字值以及兩位數以外的字串,它將全部(大概)正確排序。
您可以將呼叫移動到sortawk 腳本內部,但是您仍然有一個管道,并且會添加 awk 生成一個子shell,這樣效率會降低。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/446315.html
