100Gを超えるディスクを探すこのフィルタを短縮できますか?

100Gを超えるディスクを探すこのフィルタを短縮できますか?

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

仕事はできましたが、厄介でした。短縮できると確信しています。 lsblkとはまったく異なるものを使用したり、awkを直接使用して人が読める数値をフィルタリングしたりできます。

これが私が編集したものです:

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

100Gを超えるディスクのsdxおよびnvmexxx部分のみを出力します。私にぴったりのもの。

嬉しいですが、先生からもっと学びたいです。

答え1

出力が次のように表示される方法を指定できます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^30あなたの場合、これは100GiBまたは100e9/ 100GBです1e11

答え2

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

1e11(100GBの場合 . 100GiBを(または107374182400100*1024*1024*1024lsblk-b

lsblk -OJb、を使用するlsblkと、利用可能なすべての情報を報告できるため、より詳細な選択をしたり、より関連性の高い情報を出力したりできます。

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

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

答え3

努力する

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

これにより、grepとフィルタリングが同時に実行されます。

  • $4 ~ /G$/Gサイズのファイルをインポートする
  • $4+0 > 100検索サイズが100Gを超えています。
  • {print $1}名前を刻む

通常、同じパイプでおよびを使用する必要はありませんgrepawk

ディスクのみのインポート(パーティションなし):奇妙なフィルター

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

どこ

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

ディスクのみのインポート(パーティションなし):LSBLKフィルター

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

どこ

  • --nodeps:-d、--nodepsはスレーブやホルダーを印刷しません。

関連情報