
私の目標は、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を(または107374182400
100*1024*1024*1024
lsblk
-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}
名前を刻む
通常、同じパイプでおよびを使用する必要はありませんgrep
。awk
ディスクのみのインポート(パーティションなし):奇妙なフィルター
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はスレーブやホルダーを印刷しません。