Text-Processing
如果缺少以下行,則列印行
這與awk print 2 line back if match有關,但由於我的命令存在我無法解決的緩衝問題,我認為更好的方法是完全忽略 stderr 並查找缺少某些行的輸出。
所以我的輸出將是:
Gathering drive descriptors ... Gathering data for drive 0 ... Drive Model: DataTraveler 2.0 Gathering data for drive 1 ... Drive name: id1,sd@n5000cca17096 Drive Model: HUH721010AL4204 Drive Speed: 7200 RPMs Drive Temp: 41 C Gathering data for drive 2 ... Drive name: id1,sd@n5000cca24156 Drive Model: HUH721010AL4204 Drive Speed: 7200 RPMs Drive Temp: 41 C Gathering data for drive 3 ... Drive name: id1,sd@n5000cca8749 Drive Model: HUH721010AL4204 Gathering data for drive 4 ... Drive name: id1,sd@n5000cca19183 Drive Model: HUH721010AL4204 Drive Speed: 7200 RPMs Drive Temp: 41 C Gathering data for drive 5 ... Drive name: id1,sd@n5000cca4607 Drive Model: HUSMH8010BSS204 Gathering data for drive 6 ... Drive name: id1,sd@n5000cca10152 Drive Model: HUH721010AL4204 Drive Speed: 7200 RPMs Drive Temp: 41 C
我想
Drive name
為缺少Drive Speed
和Drive Temp
線的任何驅動器輸出 。輸出應該是:
Drive name: id1,sd@n5000cca8749 Drive name: id1,sd@n5000cca4607
這超出了我的能力範圍,但我確信
awk
可以做到,但我不打算使用awk
,任何完成任務的東西都可以工作(沒有 GNU 工具)。謝謝!
使用
mawk
andgawk
,它支持正則表達式和多字元RS
(記錄分隔符):awk -v RS='Gathering data' -F'\n' '/Drive name/ && !/Drive Speed/ && !/Drive Temp/{print$(NF-2)}' file
使用
awk
which 不支持它們,可以過濾輸入以將其替換為諸如換頁之類的單個字元:awk '/Gathering data/{$0="\f"} 1' file | awk -v RS='\f' -F'\n' '/Drive name/ && !/Drive Speed/ && !/Drive Temp/{print$(NF-2)}'
如果記錄中的行不是固定順序,則可以通過省略 列印整個記錄
{print ...}
,然後可以使用 grep 等過濾輸出。這種方法的優點是可以以明顯的方式修改匹配條件(例如,
/Drive Speed: 7200 RPMs/
而不是!/foo/ && !/bar/
等),它不會將整個文件載入到記憶體中,最重要的是,不需要您編寫一些鈍狀態機。