¿Puedo acortar este filtro, que encuentra tamaños de disco superiores a 100G?

12

Mi objetivo es obtener los discos mayores de 100G de lsblk.

Lo tengo funcionando, pero es incómodo. Estoy bastante seguro de que se puede acortar. Ya sea usando algo totalmente diferente a lsblk, o tal vez pueda filtrar números legibles por humanos directamente con awk.

Esto es lo que armé:

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

Produce solo la parte sdx y nvmexxx de los discos de más de 100G. Exactamente lo que necesito.

Estoy contento con eso, pero estoy ansioso por aprender más de ustedes Gurus 😉

chalybeum
fuente
entre 100-999GB y más grande que 100T, pero nada entre 1-99T, supongo? (terabytes ~)
hanshenrik
Sí, esa es una falla que me llamó la atención y ya se discutió en las respuestas. Por lo tanto, acepté la respuesta para hacer el filtro basado en el tamaño del byte en lugar de ser legible por humanos. Si eres de otro método, estaré encantado de aprender sobre eso.
chalybeum

Respuestas:

28

Puede especificar la forma de salida que desea lsblk:

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

Opciones utilizadas :

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

Entonces el filtrado es más fácil:

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

En su caso, eso sería 100*2^30por 100GiB o 100e9/ 1e11por 100GB.

muru
fuente
Uhhh, eso es inteligente! Eliminando lo que no se necesita en primer lugar. Una pregunta: ¿Está utilizando x * 2 ** 30 solo por coherencia con los bytes? ¿Habría inconvenientes para usar s.th. como 10 ** 3?
chalybeum
@chalybeum sí, para bytes. No, puedes usar 10 ** 9. Los valores no difieren mucho.
muru
Tenga en cuenta que OP está filtrando particiones en una línea.
UncleCarl
@UncleCarl señaló
muru
1
Tenga en cuenta que en este caso particular de límite de 100G awk también podría acortarse egrep '\d{12,}'para eliminar líneas con <12 dígitos en una secuencia. Awk es, por supuesto, más universal.
Gnudiff
18

También puede indicar lsblkque salga en formato JSON y realice el filtrado 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

Limitar a entradas de tipo disk.

( 1e11siendo 100 GB. Reemplace con 107374182400(o 100*1024*1024*1024) por 100 GiB. Debido al redondeo, lsblksin -binformes 100G para tamaños que van desde aproximadamente 99.9278 a 100.0488 GiB (por alguna razón)

Con lsblk -OJb, lsblkinforma toda la información disponible que le permite hacer una selección más detallada o generar información más o más relevante.

También puede obtener la información directamente de /sys. Con zsh:

$ printf '%s\n' /sys/class/block/*(e'[(($(<$REPLY/size) * 512 >= 1e11))]':t)
sda
sda2
Stéphane Chazelas
fuente
Esta es una verdadera respuesta de un Gurú, nadie podrá leerla. : D
Archemar
Tomo esto como un placer saberlo. Pero en esta etapa de mi viaje en bash no quiero introducir más complejidad utilizando otra herramienta.
chalybeum
Esa es una buena aplicación de jq(que aprendí hace solo unos meses).
Dubu
6

tratar

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

esto grep y filtro al mismo tiempo.

  • $4 ~ /G$/ obtener archivado con tamaño en G
  • $4+0 > 100 obtener un tamaño superior a 100G
  • {print $1} imprimir NOMBRE

como regla, nunca debería necesitar usar grepy awken la misma tubería.

para obtener solo el disco (y no la partición): filtrado awk

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

dónde

  • $6 == "disk" seleccione solo columna con disco

para obtener solo el disco (y no la partición): filtrado lsblk

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

dónde

  • --nodeps : -d, --nodeps no imprime esclavos o titulares
Archemar
fuente
Casi ahí. Todavía imprime particiones. Pero creo que puedo respaldar eso cuando tengo un poco de tiempo libre.
chalybeum
1
@chalybeum Arreglé eso, el mismo truco de filtrado se puede aplicar a la respuesta de muru.
Archemar
(Aunque probablemente usaría la --no-depsopción, de acuerdo con el estilo general de esa respuesta)
muru
2
Me temo que esto no podrá atrapar discos cuyo tamaño se muestra en terabytes (o unidades más grandes).
fra-san
@ fra-san fair point y también es cierto para mi solución original. Así que tomo el bit de filtro de disco de aquí y lo pongo en la conversión de bytes.
chalybeum