我的目标是从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
/ 1e11
100GB。
答案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
。
(为 100 GB。用(或)1e11
代替100 GiB。由于舍入,本身没有报告 100G,大小范围从大约 99.9278 到 100.0488 GiB(出于某种原因))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
and 。awk
仅获取磁盘(无分区):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 不打印从站或持有者