我可以缩短此筛选器以找到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之间什么都没有?(兆字节〜)
hanshenrik,

是的,这是一个引起我注意的缺陷,并且已经在答案中进行了讨论。因此,我接受了基于字节大小而不是人类可读的过滤器的答案。如果您使用其他方法,我将很乐意对此进行了解。
chalybeum

Answers:


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^30对100GiB或100e9/ 1e11为100GB。


嗯,这很聪明!首先清除不需要的内容。一个问题:您使用x * 2 ** 30只是为了与字节保持一致?使用s.th是否会有缺点?喜欢10 ** 3?
chalybeum

@chalybeum是的,用于字节。不,您可以使用10 ** 9。这些值相差不大。
muru

请注意,OP正在过滤单层的分区。
UncleCarl

@UncleCarl 注意
穆鲁

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

1e11是100 GB。用107374182400(或100*1024*1024*1024)替换为100 GiB。由于四舍五入,lsblk它本身没有-b报告100G,大小范围从99.9278到100.0488 GiB(出于某些原因))

使用lsblk -OJblsblk报告所有可用信息,使您可以进行更细粒度的选择或输出更多或更多相关信息。

您也可以直接从获得信息/sys。与zsh

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

这是来自上师的真实答案,没有人能够阅读。:D
Archemar

我很高兴知道这一点。但是在我的bash旅程的这个阶段,我不想使用其他工具来引入更多的复杂性。
chalybeum

这是一个不错的应用程序jq(我几个月前才知道)。
迪布

6

尝试

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

这将同时grep和过滤。

  • $4 ~ /G$/ 归档为G尺寸
  • $4+0 > 100 超过100G
  • {print $1} 打印NAME

作为一项规则,你应该永远不需要使用grep,并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不打印从属或持有者

差不多好了。它仍然打印分区。但是我认为如果我有一点空闲时间,我可以落后。
chalybeum

1
@chalybeum我已修复,可以将相同的过滤技巧应用于muru的答案。
Archemar '19

(尽管我可能会使用该--no-deps选项,以与该答案的一般风格保持一致)
muru

2
恐怕这将无法捕获大小以TB(或更大单位)显示的磁盘。
fra-san

@ fra-san公平的观点,对于我的原始解决方案也是如此。因此,我将从此处获取磁盘过滤器位,并将其放入字节转换中。
chalybeum
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.