我可以缩短这个过滤器,找到超过 100G 的磁盘大小吗?

cha*_*eum 12 grep awk disk lsblk

我的目标是从 lsblk 获取大于 100G 的磁盘。

我有它的工作,但它很尴尬。我很确定它可以缩短。要么使用与 lsblk 完全不同的东西,要么我可以直接用 awk 过滤人类可读的数字。

这是我整理的:

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

它只输出大于 100G 的磁盘的 sdx 和 nvmexxx 部分。正是我需要的。

我对此很满意,但渴望向您学习更多

mur*_*uru 28

您可以指定您想要的输出形式lsblk

% lsblk -nblo NAME,SIZE
mmcblk0   15931539456
mmcblk0p1   268435456
mmcblk0p2 15662038528
Run Code Online (Sandbox Code Playgroud)

使用的选项

-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.
Run Code Online (Sandbox Code Playgroud)

然后过滤更容易:

% lsblk -nblo NAME,SIZE | awk '$2 > 4*2^30 {print $1}' # greater than 4 GiB
mmcblk0
mmcblk0p2
Run Code Online (Sandbox Code Playgroud)

在您的情况下,那将是100*2^30100GiB 或100e9/ 1e11100GB。


Sté*_*las 18

您还可以告诉lsblk以 JSON 格式输出并使用以下命令进行过滤jq

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

或者:

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

限制为类型的条目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
Run Code Online (Sandbox Code Playgroud)


Arc*_*mar 6

尝试

lsblk| awk '$4 ~ /G$/ && $4+0 > 100 {print $1}'
Run Code Online (Sandbox Code Playgroud)

这将同时进行 grep 和过滤。

  • $4 ~ /G$/ 以 G 中的大小归档
  • $4+0 > 100 获取大小超过 100G
  • {print $1} 打印名称

通常,您永远不需要在同一管道中使用grepawk

只获取磁盘(没有分区):awk 过滤

lsblk| awk '$4 ~ /G$/ && $4+0 > 100 && $6 == "disk"  {print $1}'
Run Code Online (Sandbox Code Playgroud)

在哪里

  • $6 == "disk" 仅选择带有磁盘的列

只获取磁盘(没有分区):lsblk 过滤

lsblk --nodeps| awk '$4 ~ /G$/ && $4+0 > 100 {print $1}'
Run Code Online (Sandbox Code Playgroud)

在哪里

  • --nodeps : -d, --nodeps 不打印奴隶或持有人

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