2012-05-17 56 views
3

我試圖從linux的fdisk -l輸出中獲取磁盤信息。在unix中用分號表示的grep

fdisk -l | grep -E 'Disk /dev/sd.\:' 

我得到以下輸出。

Disk /dev/sde doesn't contain a valid partition table 
Disk /dev/sda: 1000.2 GB, 1000204886016 bytes 
Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes 

但我希望得到的是

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes 
Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes 

我試圖做到這一點

fdisk -l | grep -E 'Disk /dev/sd.\:' | grep -v "contain" 

,但我不知道爲什麼的grep沒有忽略包含「包含」行。

回答

3

嘗試此命令:

fdisk -l 2>/dev/null | grep -E 'Disk /dev/sd.\:' 

或簡單地:

fdisk -l 2>/dev/null 

問題是線Disk /dev/sde doesn't contain a valid partition table正在生成作爲誤差和stderr代替stdout被寫入。

在unix管道只有管道輸出寫在stdout從前面的命令與管道的RHS命令因此,您的grep命令只能在第二和第三行,而您的終端的第一行來自stderr

+0

我認爲這是更好(風險較小)重定向'stderr'到'stdout'和處理該組合輸出,而不是在案件'的/ dev/null'其他一些意外的錯誤情況發生。前者你會看到錯誤(取決於你如何grep),但是一旦所有的'stderr'進入'/ dev/null',你都不會知道是否發生了其他意外錯誤。 – Levon

0

您的原始grep不起作用,因爲有關「無效分區」的錯誤消息被寫入stderr。解決方案是重定向stderrstdout然後 grep它。根據shell的不同,命令會有所不同。

例如,CSH/tcsh中:

fdisk -l |& grep -E 'Disk /dev/sd.\:' | grep -v "contain" 

SH/bash中:

fdisk -l 2>&1 | grep -E 'Disk /dev/sd.\:' | grep -v "contain" 

:重定向/抑制所有的stderr/dev/null是危險的,因爲所有錯誤消息(預期和不是)將會去那裏。結合stderrstdout更安全,並選擇性地處理該流。

0

所有的unix命令都有兩個輸出; stderr和stdout。 stderr上輸出錯誤,stdout上輸出正常輸出。在你的例子中,你可以發送stderr到/ dev/null來擺脫多餘的行。就像這樣:

fdisk -l 2>/dev/null