Posso reduzir esse filtro, que encontra tamanhos de disco acima de 100G?

12

Meu objetivo é obter os discos maiores que 100G do lsblk.

Eu tenho que trabalhar, mas é estranho. Tenho certeza de que pode ser reduzido. Ou usando algo totalmente diferente de lsblk, ou talvez eu possa filtrar números legíveis por humanos diretamente com awk.

Aqui está o que eu montei:

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

Ele gera apenas a parte sdx e nvmexxx dos discos maiores que 100G. Exatamente o que eu preciso.

Estou feliz com isso, mas estou ansioso para aprender mais com você Gurus 😉

chalybeum
fonte
entre 100-999GB e maior que 100T, mas nada entre 1-99T, presumo? (terabytes ~)
hanshenrik
Sim, essa é uma falha que chamou minha atenção e já foi discutida nas respostas. Portanto, aceitei a resposta para fazer o filtro com base no tamanho do byte em vez de legível por humanos. Se você de outro método, ficarei feliz em aprender sobre isso.
chalybeum

Respostas:

28

Você pode especificar a forma de saída desejada lsblk:

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

Opções 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.

Então a filtragem é mais fácil:

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

No seu caso, isso seria 100*2^30para 100GiB ou 100e9/ 1e11para 100GB.

muru
fonte
Uhhh, isso é inteligente! Eliminando o que não é necessário em primeiro lugar. Uma pergunta: você está usando x * 2 ** 30 apenas para consistência com os bytes? Haveria uma desvantagem em usar s.th. tipo 10 ** 3?
chalybeum
@chalybeum sim, para bytes. Não, você pode usar 10 ** 9. Os valores não diferem muito.
Muru
Observe que o OP está filtrando partições no one-liner.
UncleCarl 01/08/19
@UncleCarl observou
muru
1
Observe que, neste caso específico, o limite de 100G awk também pode ser reduzido egrep '\d{12,}'para remover linhas com <12 dígitos em uma sequência. Awk é obviamente mais universal.
Gnudiff 2/08/19
18

Você também pode solicitar lsblka saída no formato JSON e fazer a filtragem com jq:

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

Ou:

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

Para limitar as entradas do tipo disk.

( 1e11sendo 100 GB. Substitua por 107374182400(ou 100*1024*1024*1024) por 100 GiB. Por causa do arredondamento, lsblkele próprio não -binforma 100G para tamanhos que variam de 99,9278 a 100,0488 GiB (por algum motivo))

Com lsblk -OJb, lsblkreporta todas as informações disponíveis, o que permite fazer uma seleção mais refinada ou gerar informações mais ou mais relevantes.

Você também pode obter as informações diretamente de /sys. Com zsh:

$ printf '%s\n' /sys/class/block/*(e'[(($(<$REPLY/size) * 512 >= 1e11))]':t)
sda
sda2
Stéphane Chazelas
fonte
Esta é uma resposta verdadeira de um Guru, ninguém será capaz de lê-la. : D
Archemar 01/08/19
Eu tomo isso como um bom saber. Mas nesta fase da minha jornada no bash, não quero introduzir mais complexidade usando mais uma ferramenta.
chalybeum 02/08/19
Essa é uma boa aplicação de jq(sobre a qual eu aprendi apenas alguns meses atrás).
Dubu
6

experimentar

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

isso irá grep e filtrar ao mesmo tempo.

  • $4 ~ /G$/ ficar arquivado com tamanho em G
  • $4+0 > 100 obter tamanho acima de 100G
  • {print $1} imprimir NAME

Como regra, você nunca deve necessidade de usar grepe awkno mesmo tubo.

obter apenas disco (e nenhuma partição): filtro awk

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

Onde

  • $6 == "disk" selecione apenas coluna com disco

obter apenas disco (e nenhuma partição): filtragem lsblk

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

Onde

  • --nodeps : -d, --nodeps não imprime escravos ou titulares
Archemar
fonte
Quase lá. Ainda imprime partições. Mas acho que posso ficar por trás disso quando tiver um pouco de tempo livre.
chalybeum
1
@chalybeum Corrigi isso, o mesmo truque de filtragem pode ser aplicado à resposta de muru.
Archemar 01/08/19
(Embora eu provavelmente iria usar a --no-depsopção, de acordo com o estilo geral de que a resposta)
Muru
2
Receio que isso não consiga capturar discos cujo tamanho é mostrado em terabytes (ou unidades maiores).
fra-san
@ fra-san fair point e também é válido para a minha solução original. Então, eu estou pegando o bit do filtro de disco daqui e colocando-o na conversão de bytes.
chalybeum