web-dev-qa-db-fra.com

Puis-je raccourcir ce filtre, qui trouve des tailles de disque supérieures à 100G?

Mon objectif est d'obtenir des disques supérieurs à 100G auprès de lsblk.

Je le fais fonctionner, mais c'est gênant. Je suis sûr que cela peut être raccourci. Soit en utilisant quelque chose de totalement différent de lsblk, soit je peux filtrer les nombres lisibles par l'homme directement avec awk.

Voici ce que j'ai rassemblé:

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

Il ne produit que la partie sdx et nvmexxx des disques supérieurs à 100G. Exactement ce dont j'ai besoin.

J'en suis content, mais j'ai hâte d'en savoir plus sur vous gourous ????

12
chalybeum

Vous pouvez spécifier la forme de sortie souhaitée à partir de lsblk:

% lsblk -nblo NAME,SIZE
mmcblk0   15931539456
mmcblk0p1   268435456
mmcblk0p2 15662038528

Options utilisées :

-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.

Ensuite, le filtrage est plus facile:

% lsblk -nblo NAME,SIZE | awk '$2 > 4*2^30 {print $1}' # greater than 4 GiB
mmcblk0
mmcblk0p2

Dans votre cas, ce serait 100*2^30 pour 100 Go ou 100e9/1e11 pour 100 Go.

28
muru

Vous pouvez également dire à lsblk de sortir au format JSON et de faire le filtrage avec jq:

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

Ou:

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

Pour limiter aux entrées de type disk.

(1e11 soit 100 Go. Remplacer par 107374182400 (ou 100*1024*1024*1024) pour 100 Gio. En raison de l'arrondissement, lsblk lui-même sans -b signale 100G pour des tailles allant d'environ 99,9278 à 100,0488 GiB (pour une raison quelconque))

Avec lsblk -OJb, lsblk rapporte toutes les informations disponibles, ce qui vous permet de faire une sélection plus fine ou de produire des informations plus ou plus pertinentes.

Vous pouvez également obtenir les informations directement à partir de /sys. Avec zsh:

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

essayer

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

ce sera grep et filtrer en même temps.

  • $4 ~ /G$/ se classer avec la taille en G
  • $4+0 > 100 obtenir une taille supérieure à 100G
  • {print $1} print NAME

en règle générale, vous ne devriez jamais avoir besoin d'utiliser grep et awk dans le même canal.

pour obtenir uniquement le disque (et pas de partition): filtrage awk

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

  • $6 == "disk" sélectionner uniquement la colonne avec le disque

pour obtenir uniquement le disque (et pas de partition): filtrage lsblk

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

  • --nodeps: -d, --nodeps n'imprime pas les esclaves ou les détenteurs
6
Archemar