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

12

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 gekürzt werden kann. Entweder indem ich etwas völlig anderes als lsblk benutze, oder vielleicht kann ich 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 wird nur der sdx- und der nvmexxx-Teil 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 dir zu lernen

Chalybeum
quelle
zwischen 100-999GB und größer als 100T, aber nichts zwischen 1-99T, nehme ich an? (Terabyte ~)
Hanshenrik
Ja, das ist ein Fehler, der meine Aufmerksamkeit verloren hat und der bereits in den Antworten besprochen wurde. Ich akzeptierte daher die Antwort, den Filter basierend auf der Bytegröße anstelle von lesbar zu machen. Wenn Sie von einer anderen Methode sprechen, würde ich mich freuen, davon zu erfahren.
Chalybeum

Antworten:

28

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

% 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 das Filtern einfacher:

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

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

muru
quelle
Uhhh, das ist schlau! Was überhaupt nicht benötigt wird, wird ausgesondert. Eine Frage: Sie verwenden x * 2 ** 30 nur aus Gründen der Konsistenz mit den Bytes? Wäre es nachteilig, ab zu verwenden. wie 10 ** 3?
chalybeum
@chalybeum ja, für Bytes. Nein, Sie können 10 ** 9 verwenden. Die Werte unterscheiden sich nicht sehr.
muru
Beachten Sie, dass OP Partitionen im Einzeiler herausfiltert.
UncleCarl
@ OncleCarl notiert
muru
1
Beachten Sie, dass in diesem speziellen Fall der 100G-Grenze awk auch gekürzt werden kann egrep '\d{12,}', um Zeilen mit <12 Ziffern in einer Sequenz zu entfernen. Awk ist natürlich universeller.
Gnudiff
18

Sie können auch festlegen lsblk, dass die Ausgabe im JSON-Format erfolgen soll und die Filterung mit jq:

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

Oder:

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

Auf Einträge des Typs beschränken disk.

( 1e11Ersetzen Sie 100 GB durch 107374182400(oder 100*1024*1024*1024) für 100 GB. Aufgrund von Rundungen werden lsblkohne -bBerichte 100 GB für Größen zwischen 99,9278 und 100,0488 GB (aus irgendeinem Grund) ausgegeben.)

Mit lsblk -OJbwerden lsblkalle verfügbaren Informationen gemeldet, mit denen Sie eine feinere Auswahl treffen oder mehr oder relevantere Informationen ausgeben können.

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

$ printf '%s\n' /sys/class/block/*(e'[(($(<$REPLY/size) * 512 >= 1e11))]':t)
sda
sda2
Stéphane Chazelas
quelle
Dies ist eine wahre Antwort von einem Guru, niemand wird sie lesen können. : D
Archemar
Ich nehme das als schön zu wissen. Aber in dieser Phase meiner Reise in Bash möchte ich keine weitere Komplexität einführen, indem ich noch ein anderes Werkzeug benutze.
Chalybeum
Das ist eine nette Anwendung von jq(die ich erst vor einigen Monaten kennengelernt habe).
Dubu
6

Versuchen

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

Dadurch wird gleichzeitig gegriffen und gefiltert.

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

In der Regel sollten Sie niemals grepund awkin der gleichen Leitung verwenden müssen.

um nur festplatte (und keine partition) zu bekommen: awk filterung

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

wo

  • $6 == "disk" Nur Spalte mit Platte 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 Holder
Archemar
quelle
Fast dort. Es werden weiterhin Partitionen gedruckt. Aber ich denke, ich kann dahinter kommen, wenn ich ein bisschen Freizeit habe.
Chalybeum
1
@chalybeum Ich habe das behoben, der gleiche Filtertrick kann auf Murus Antwort angewendet werden.
Archemar
(Obwohl ich diese --no-depsOption wahrscheinlich verwenden würde , um dem allgemeinen Stil dieser Antwort zu entsprechen)
muru
2
Ich befürchte, dies kann keine Datenträger fangen, deren Größe in Terabyte (oder größeren Einheiten) angezeigt wird.
fra-san
@ fra-san fair point und das gilt auch für meine ursprüngliche lösung. Also nehme ich das Festplattenfilterbit von hier und setze es in die Bytekonvertierung ein.
Chalybeum