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 が「contain」を含む行を無視しない理由がわかりません。

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 でのパイプstdoutは、パイプの RHS のコマンドを使用して前のコマンドから書き込まれた出力のみをパイプするため、grep コマンドは 2 行目と 3 行目でのみ機能し、端末の 1 行目はstderr.

于 2012-05-17T16:57:11.293 に答える
0

「有効なパーティションがありません」というエラー メッセージが に書き込まれるため、元の grep は機能しませんstderr。解決策は、リダイレクト stderrstdoutからgrep することです。シェルによって、コマンドは異なります。

例: 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

于 2012-05-17T16:57:01.403 に答える
0

すべての UNIX コマンドには 2 つの出力があります。stderr と stdout。エラーは stderr に出力され、通常の出力は stdout に出力されます。あなたの例では、 stderr を /dev/null に送信して、余分な行を取り除くことができます。このような:

fdisk -l 2>/dev/null

于 2012-05-17T16:58:53.417 に答える