Posso abbreviare questo filtro, che trova dimensioni del disco superiori a 100 G?


12

Il mio obiettivo è quello di ottenere dischi superiori a 100G da lsblk.

Ho funzionato, ma è imbarazzante. Sono abbastanza sicuro che può essere abbreviato. O usando qualcosa di totalmente diverso da lsblk, o forse posso filtrare i numeri leggibili umani direttamente con awk.

Ecco cosa ho messo insieme:

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

Produce solo la parte sdx e nvmexxx dei dischi di dimensioni superiori a 100G. Esattamente quello di cui ho bisogno.

Ne sono felice, ma non vedo l'ora di saperne di più dai tuoi Guru 😉


tra 100-999 GB e più grande di 100 T, ma niente tra 1 e 99 T, presumo? (terabyte ~)
hanshenrik il

Sì, questo è un difetto che ha attirato la mia attenzione ed è già stato discusso nelle risposte. Ho quindi accettato la risposta per fare il filtro in base alla dimensione dei byte anziché alla lettura umana. Se hai un altro metodo, sarò felice di conoscerlo.
Chalybeum,

Risposte:


28

È possibile specificare la forma di output desiderata da lsblk:

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

Opzioni utilizzate :

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

Quindi il filtraggio è più semplice:

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

Nel tuo caso, sarebbe 100*2^30per 100GiB o 100e9/ 1e11per 100GB.


Uhhh, è intelligente! In primo luogo, eliminiamo ciò che non è necessario. Una domanda: stai usando x * 2 ** 30 solo per coerenza con i byte? Ci sarebbe l'inconveniente di usare s.th. come 10 ** 3?
Chalybeum,

@chalybeum sì, per byte. No, puoi usare 10 ** 9. I valori non differiscono molto.
muru,

Si noti che OP sta filtrando le partizioni nel one-liner.
UncleCarl

@UncleCarl notato
muru

1
Si noti che in questo caso particolare di awk di confine 100G potrebbe anche essere abbreviato egrep '\d{12,}'per rimuovere le linee con <12 cifre in una sequenza. Awk è ovviamente più universale.
Gnudiff,

18

Puoi anche dire lsblkall'output in formato JSON e fare il filtro con jq:

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

O:

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

Limitare alle voci di tipo disk.

( 1e11essendo 100 GB. Sostituire con 107374182400(o 100*1024*1024*1024) per 100 GiB. A causa dell'arrotondamento, esso lsblkstesso non -briporta 100 G per dimensioni che vanno da circa 99,9278 a 100,0488 GiB (per qualche motivo))

Con lsblk -OJb, lsblkriporta tutte le informazioni disponibili che consentono di effettuare una selezione più precisa e di produrre informazioni più o più pertinenti.

È inoltre possibile ottenere le informazioni direttamente da /sys. Con zsh:

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

Questa è una vera risposta di un Guru, nessuno sarà in grado di leggerlo. : D
Archemar,

Lo prendo come un piacere da sapere. Ma in questa fase del mio viaggio a Bash non voglio introdurre ulteriore complessità usando l'ennesimo strumento.
Chalybeum,

Questa è una bella applicazione jq(di cui ho appreso solo alcuni mesi fa).
Dubu,

6

provare

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

questo grep e filtrerà allo stesso tempo.

  • $4 ~ /G$/ viene archiviato con dimensioni in G
  • $4+0 > 100 ottenere dimensioni superiori a 100G
  • {print $1} stampa NAME

di regola non dovresti mai aver bisogno di usare grepe awknella stessa pipa.

per ottenere solo il disco (e nessuna partizione): filtro awk

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

dove

  • $6 == "disk" seleziona solo la colonna con il disco

per ottenere solo il disco (e nessuna partizione): filtro lsblk

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

dove

  • --nodeps : -d, --nodeps non stampa schiavi o possessori

Quasi lì. Stampa ancora le partizioni. Ma penso di potercela fare quando avrò un po 'di tempo libero.
Chalybeum,

1
@chalybeum Ho risolto questo, lo stesso trucco di filtraggio può essere applicato alla risposta di Muru.
Archemar,

(Anche se probabilmente userei l' --no-depsopzione, in linea con lo stile generale di quella risposta)
muru

2
Temo che questo non riuscirà a catturare i dischi le cui dimensioni sono mostrate in terabyte (o unità più grandi).
fra-san,

@ fra-san fair point ed è vero anche per la mia soluzione originale. Quindi sto prendendo il bit del filtro del disco da qui e lo inserisco nella conversione byte.
Chalybeum,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.