100Gを超えるディスクサイズを検出するこのフィルターを短縮できますか?


12

私の目標は、lsblkから100Gを超えるディスクを取得することです。

私はそれを動作させていますが、それは厄介です。短縮できると確信しています。lsblkとはまったく異なるものを使用するか、awkを使用して人間が読み取れる数値を直接フィルター処理することができます。

ここに私がまとめたものがあります:

lsblk | grep disk | awk '{print$1,$4}' | grep G | sed 's/.$//' | awk '{if($2>100)print$1}'

100Gより大きいディスクのsdxおよびnvmexxx部分のみを出力します。まさに私が必要なもの。

私はそれで満足していますが、あなたからもっと学びたいと思っています。


100-999GBから100Tを超えていますが、1-99Tの間ではないでしょうか?(テラバイト〜)
ハンシェンリック

はい、それは私の注意をそらし、すでに答えで議論された1つの欠陥です。したがって、人間が読める形式ではなく、バイトサイズに基づいてフィルタを実行するという答えを受け入れました。別の方法をお使いの場合は、喜んでそのことについて学びます。
chalybeum

回答:


28

必要な出力形式を指定できますlsblk

% lsblk -nblo NAME,SIZE
mmcblk0   15931539456
mmcblk0p1   268435456
mmcblk0p2 15662038528

使用されるオプション

-b, --bytes
      Print the SIZE column in bytes rather than in human-readable format.

-l, --list
      Use the list output format.

-n, --noheadings
      Do not print a header line.

-o, --output list
      Specify which output columns to print.  Use --help to get a list of  all  supported
      columns.

次に、フィルタリングが簡単になります。

% lsblk -nblo NAME,SIZE | awk '$2 > 4*2^30 {print $1}' # greater than 4 GiB
mmcblk0
mmcblk0p2

あなたのケースでは、それはなるだろう100*2^30100GiBまたは100e9/ 1e11100ギガバイトのために。


うーん、それは賢いです!そもそも不要なものを取り除く。1つの質問:バイトとの一貫性のためだけにx * 2 ** 30を使用していますか?s.thを使用することには欠点がありますか?10 ** 3のような?
chalybeum

@chalybeumはい、バイト用。いいえ、10 ** 9を使用できます。値は大差ありません。
ムル

OPは、ワンライナーでパーティションを除外していることに注意してください。
アンクルカール

@UncleCarlが注目
muru

1
この100G境界の特定のケースでは、awkを短縮しegrep '\d{12,}'て、シーケンス内の12桁未満の行を削除することもできます。Awkはもちろんより普遍的です。
-Gnudiff

18

またlsblk、JSON形式で出力し、次のようにフィルタリングを行うように指示することもできますjq

$ lsblk -Jb | jq -r '..|select(.size? >= 1e11).name'
sda
sda2

または:

$ lsblk -Jb | jq -r '..|select(.type? == "disk" and .size? >= 1e11).name'
sda

タイプのエントリに制限しますdisk

1e11100 GBである。100GiBの107374182400場合は(または100*1024*1024*1024)に置き換えます。丸めのため、約99.9278〜100.0488 GiBの範囲のサイズのレポート100G lsblk自体はありません-b(何らかの理由で))

ではlsblk -OJblsblkあなたはよりきめ細かい選択または出力より以上の関連情報を行うことができます利用可能なすべての情報を報告します。

から直接情報を取得することもでき/sysます。でzsh

$ printf '%s\n' /sys/class/block/*(e'[(($(<$REPLY/size) * 512 >= 1e11))]':t)
sda
sda2

これは第一人者からの真の答えであり、誰も読むことができません。:D
アーケマー

これを知っておくといいと思います。しかし、bashでの旅のこの段階では、さらに別のツールを使用してさらに複雑なものを導入したくありません。
-chalybeum

これは素晴らしいアプリケーションですjq(数か月前に私が学んだことです)。
ドゥブ

6

試してみる

lsblk| awk '$4 ~ /G$/ && $4+0 > 100 {print $1}'

これは、同時にgrepとフィルタリングを行います。

  • $4 ~ /G$/ Gのサイズでファイルされる
  • $4+0 > 100 100Gを超えるサイズを取得
  • {print $1} 名前を印刷する

原則として、あなたは使用する必要はありませんgrepし、awk同じパイプに。

ディスクのみ(パーティションなし)を取得するには:awk filtering

lsblk| awk '$4 ~ /G$/ && $4+0 > 100 && $6 == "disk"  {print $1}'

どこ

  • $6 == "disk" ディスクがある列のみを選択する

ディスクのみ(パーティションなし)を取得するには:lsblk filtering

lsblk --nodeps| awk '$4 ~ /G$/ && $4+0 > 100 {print $1}'

どこ

  • --nodeps :-d、-nodepsはスレーブまたはホルダーを出力しません

ほぼそこに。パーティションは引き続き印刷されます。しかし、私は少し自由な時間があるとき、私はその背後にあると思うと思います。
chalybeum

1
@chalybeum修正して、muruの答えにも同じフィルタリングト​​リックを適用できることを修正しました。
アーケマー

(おそらく--no-deps、その回答の一般的なスタイルに合わせて、オプションを使用しますが)
-muru

2
サイズがテラバイト(またはそれ以上の単位)で示されているディスクをキャッチできないのではないかと思います。
fraさん

@ fra-san公正な点であり、元のソリューションにも当てはまります。そこで、ここからディスクフィルタービットを取得して、バイト変換に使用しています。
chalybeum
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.