2012-05-17 21 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