it-swarm.com.de

Kann ich diesen Filter kürzen, der Festplattengrößen über 100 G findet?

Mein Ziel ist es, die Festplatten größer als 100G von lsblk zu bekommen.

Ich habe es funktioniert, aber es ist umständlich. Ich bin mir ziemlich sicher, dass es verkürzt werden kann. Entweder indem ich etwas völlig anderes als lsblk verwende, oder ich kann von Menschen lesbare Zahlen direkt mit awk filtern.

Folgendes habe ich zusammengestellt:

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

Es werden nur die Teile sdx und nvmexxx der Festplatten ausgegeben, die größer als 100 G sind. Genau das, was ich brauche.

Ich bin zufrieden damit, aber ich bin gespannt darauf, mehr von euch Gurus zu lernen ????

12
chalybeum

Sie können die gewünschte Ausgabeform für lsblk angeben:

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

Verwendete Optionen :

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

Dann ist die Filterung einfacher:

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

In Ihrem Fall wäre das 100*2^30 für 100GiB oder 100e9/1e11 für 100 GB.

28
muru

Sie können lsblk auch anweisen, im JSON-Format auszugeben und die Filterung mit jq durchzuführen:

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

Oder:

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

Beschränkung auf Einträge vom Typ disk.

(1e11 ist 100 GB. Ersetzen mit 107374182400 (oder 100*1024*1024*1024) für 100 GiB. Wegen der Rundung lsblk selbst ohne -b meldet 100G für Größen von etwa 99,9278 bis 100,0488 GiB (aus irgendeinem Grund))

Mit lsblk -OJb, lsblk meldet alle verfügbaren Informationen, mit denen Sie eine feinkörnigere Auswahl treffen oder mehr oder mehr relevante Informationen ausgeben können.

Sie können die Informationen auch direkt von /sys. Mit zsh:

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

versuchen

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

dadurch wird gleichzeitig grep und gefiltert.

  • $4 ~ /G$/ mit der Größe in G abgelegt werden
  • $4+0 > 100 Größe über 100G bekommen
  • {print $1} NAME drucken

in der Regel sollten Sie niemals grep und awk in derselben Pipe verwenden müssen.

um nur die Festplatte (und keine Partition) zu erhalten: awk-Filterung

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

wo

  • $6 == "disk" Nur Spalte mit Datenträger auswählen

um nur die Festplatte (und keine Partition) zu erhalten: lsblk-Filterung

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

wo

  • --nodeps: -d, --nodeps drucken keine Slaves oder Halter
6
Archemar