3

我正在尝试从fdisk -llinux 上的输出中获取磁盘信息。

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 不忽略包含“包含”的行。

4

3 回答 3

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 中,管道仅使用管道stdoutRHS 上的命令从上一个命令写入的输出管道,因此您的 grep 命令仅在第 2 行和第 3 行工作,而终端上的第 1 行来自stderr.

于 2012-05-17T16:57:11.293 回答
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"

注意:重定向/抑制所有stderrto/dev/null是危险的,因为所有错误消息(预期的和不是的)都会去那里。有选择地组合和处理该流要安全stderr得多stdout

于 2012-05-17T16:57:01.403 回答
0

所有的 unix 命令都有两个输出;标准错误和标准输出。错误在 stderr 上打印,在 stdout 上正常输出。在您的示例中,您可以将 stderr 发送到 /dev/null 以摆脱多余的行。像这样:

fdisk -l 2>/dev/null

于 2012-05-17T16:58:53.417 回答