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

12

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 😉

chalybeum
la source
entre 100-999 Go et plus grand que 100T, mais rien entre 1-99T, je présume? (téraoctets ~)
hanshenrik
Oui, c'est un défaut qui a glissé mon attention et a déjà été discuté dans les réponses. J'ai donc accepté la réponse pour faire le filtre basé sur la taille en octets au lieu d'être lisible par l'homme. Si vous avez une autre méthode, je serai heureux d'en savoir plus.
chalybeum

Réponses:

28

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^30pour 100GiB ou 100e9/ 1e11pour 100Go.

muru
la source
Uhhh, c'est intelligent! Éliminer ce qui n'est pas nécessaire en premier lieu. Une question: vous utilisez x * 2 ** 30 juste pour la cohérence avec les octets? Y aurait-il un inconvénient à utiliser s.th. comme 10 ** 3?
chalybeum
@chalybeum oui, pour les octets. Non, vous pouvez utiliser 10 ** 9. Les valeurs ne diffèrent pas beaucoup.
muru
Notez que OP filtre les partitions dans la ligne unique.
UncleCarl
@UncleCarl a noté
muru
1
Notez que dans ce cas particulier de awk de frontière 100G, vous pouvez également être raccourci egrep '\d{12,}'pour supprimer les lignes avec <12 chiffres dans une séquence. Awk est bien sûr plus universel.
Gnudiff
18

Vous pouvez également indiquer la lsblksortie au format JSON et effectuer 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

Limiter aux entrées de type disk.

( 1e11soit 100 Go. Remplacez par 107374182400(ou 100*1024*1024*1024) pour 100 Gio. En raison de l'arrondissement, lsblklui - même sans -brapports 100 G pour des tailles allant d'environ 99,9278 à 100,0488 Gio (pour une raison quelconque))

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

Vous pouvez également obtenir les informations directement auprès de /sys. Avec zsh:

$ printf '%s\n' /sys/class/block/*(e'[(($(<$REPLY/size) * 512 >= 1e11))]':t)
sda
sda2
Stéphane Chazelas
la source
Ceci est une vraie réponse d'un gourou, personne ne pourra la lire. : D
Archemar
Je prends cela comme une bonne chose à savoir. Mais à ce stade de mon voyage en bash, je ne veux pas introduire de complexité supplémentaire en utilisant encore un autre outil.
chalybeum
C'est une belle application de jq(dont j'ai appris il y a seulement quelques mois).
Dubu
6

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} imprimer le NOM

en règle générale, vous ne devriez jamais avoir besoin d'utiliser grepet awkdans le même tuyau.

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
Archemar
la source
Presque là. Il imprime toujours des partitions. Mais je pense que je peux y arriver quand j'ai un peu de temps libre.
chalybeum
1
@chalybeum J'ai corrigé cela, la même astuce de filtrage peut être appliquée à la réponse de muru.
Archemar
(Bien que j'utiliserais probablement l' --no-depsoption, conformément au style général de cette réponse)
muru
2
Je crains que cela ne réussisse pas à attraper des disques dont la taille est indiquée en téraoctets (ou unités plus grandes).
fra-san
@ fra-san fair point et est également vrai pour ma solution d'origine. Donc, je prends le bit de filtre de disque d'ici et le mets dans la conversion d'octets.
chalybeum