Text-Processing

如果缺少以下行,則列印行

  • January 19, 2020

這與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 SpeedDrive Temp線的任何驅動器輸出 。

輸出應該是:

Drive name:  id1,sd@n5000cca8749
Drive name:  id1,sd@n5000cca4607

這超出了我的能力範圍,但我確信awk可以做到,但我不打算使用awk,任何完成任務的東西都可以工作(沒有 GNU 工具)。謝謝!

使用mawkand gawk,它支持正則表達式和多字元RS(記錄分隔符):

awk -v RS='Gathering data' -F'\n' '/Drive name/ && !/Drive Speed/ && !/Drive Temp/{print$(NF-2)}' file

使用awkwhich 不支持它們,可以過濾輸入以將其替換為諸如換頁之類的單個字元:

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/等),它不會將整個文件載入到記憶體中,最重要的是,不需要您編寫一些鈍狀態機。

引用自:https://unix.stackexchange.com/questions/562661