Sort
按埋在裡面的數值對文件中的行進行排序
f3
我正在編寫一個 Bash 腳本來使用工具測試 USB 快閃記憶體是否存在錯誤。我有這樣的文本(通過從程序中獲取日誌創建f3read
):2017-10-25_09:30:22/sdf.log:Data LOST: 4.00 KB (8 sectors) 2017-10-25_09:30:22/sdi.log:Data LOST: 5.00 KB (10 sectors) 2017-10-25_09:30:22/sdj.log:Data LOST: 2.35 MB (4822 sectors) 2017-10-25_09:30:22/sdn.log:Data LOST: 5.00 KB (10 sectors) 2017-10-25_09:30:22/sdo.log:Data LOST: 4.00 KB (8 sectors) 2017-10-25_09:30:22/sdp.log:Data LOST: 4.00 KB (8 sectors) 2017-10-25_09:30:22/sdq.log:Data LOST: 2.00 KB (4 sectors) 2017-10-25_14:37:03/sdb.log:Data LOST: 5.00 KB (10 sectors) 2017-10-25_14:37:03/sdc.log:Data LOST: 3.00 KB (6 sectors) 2017-10-26_09:17:59/sdd.log:Data LOST: 3.00 KB (6 sectors) 2017-10-26_09:17:59/sde.log:Data LOST: 2.00 KB (4 sectors) 2017-10-26_09:17:59/sdf.log:Data LOST: 3.00 KB (6 sectors) 2017-10-26_09:17:59/sdg.log:Data LOST: 6.00 KB (12 sectors) 2017-10-26_09:17:59/sdh.log:Data LOST: 611.29 MB (1251918 sectors) 2017-10-26_09:17:59/sdi.log:Data LOST: 6.00 KB (12 sectors) 2017-10-26_09:17:59/sdl.log:Data LOST: 6.00 KB (12 sectors) 2017-10-26_09:17:59/sdo.log:Data LOST: 3.00 KB (6 sectors) 2017-10-26_09:17:59/sdp.log:Data LOST: 2.00 KB (4 sectors) 2017-10-26_09:17:59/sdq.log:Data LOST: 414.60 MB (849106 sectors) 2017-10-26_09:17:59/sdr.log:Data LOST: 65.29 MB (133712 sectors) 2017-10-26_09:17:59/sds.log:Data LOST: 5.00 KB (10 sectors)
我想按行尾記錄的壞扇區數對行進行排序。我試過使用
sort
,但我不知道如何使用它的--key
選項來讓它做我想做的事。我不能先剪斷線,因為我需要提取驅動器名稱(sda、sdb 等)以生成報告。
sort -V
如果該選項可用,請使用-V,–版本排序
文本中(版本)數字的自然排序
$ <cmd> | sort -k5,5V 2017-10-25_09:30:22/sdq.log:Data LOST: 2.00 KB (4 sectors) 2017-10-26_09:17:59/sde.log:Data LOST: 2.00 KB (4 sectors) 2017-10-26_09:17:59/sdp.log:Data LOST: 2.00 KB (4 sectors) 2017-10-25_14:37:03/sdc.log:Data LOST: 3.00 KB (6 sectors) 2017-10-26_09:17:59/sdd.log:Data LOST: 3.00 KB (6 sectors) 2017-10-26_09:17:59/sdf.log:Data LOST: 3.00 KB (6 sectors) 2017-10-26_09:17:59/sdo.log:Data LOST: 3.00 KB (6 sectors) 2017-10-25_09:30:22/sdf.log:Data LOST: 4.00 KB (8 sectors) 2017-10-25_09:30:22/sdo.log:Data LOST: 4.00 KB (8 sectors) 2017-10-25_09:30:22/sdp.log:Data LOST: 4.00 KB (8 sectors) 2017-10-25_09:30:22/sdi.log:Data LOST: 5.00 KB (10 sectors) 2017-10-25_09:30:22/sdn.log:Data LOST: 5.00 KB (10 sectors) 2017-10-25_14:37:03/sdb.log:Data LOST: 5.00 KB (10 sectors) 2017-10-26_09:17:59/sds.log:Data LOST: 5.00 KB (10 sectors) 2017-10-26_09:17:59/sdg.log:Data LOST: 6.00 KB (12 sectors) 2017-10-26_09:17:59/sdi.log:Data LOST: 6.00 KB (12 sectors) 2017-10-26_09:17:59/sdl.log:Data LOST: 6.00 KB (12 sectors) 2017-10-25_09:30:22/sdj.log:Data LOST: 2.35 MB (4822 sectors) 2017-10-26_09:17:59/sdr.log:Data LOST: 65.29 MB (133712 sectors) 2017-10-26_09:17:59/sdq.log:Data LOST: 414.60 MB (849106 sectors) 2017-10-26_09:17:59/sdh.log:Data LOST: 611.29 MB (1251918 sectors)
POSIXly,你可以這樣做:
sort -t '(' -k2n < file
那就是將欄位分隔符設置為
(
並以數字方式對第二個欄位(或者更確切地說從第二個欄位開始的行的部分)進行排序。或者,您可以保留第 5個欄位的預設欄位分隔符(從非空白到空白的過渡)
" (12"
並使用:sort -k5.3n < file
(即,從第 5個欄位的第3個字元開始的行部分按數字排序)。
對於平局,最後的排序順序開始發揮作用,這是整行的詞彙比較(這裡方便地給你一個時間順序)。
如果您想對驅動器名稱進行排序,您可以使用:
sort -t '(' -k2n -k1.21
(第二個鍵是從第 21 個字元開始的行部分,詞法比較)