Eu tenho um arquivo .img do qual gostaria de extrair 2 valores derivados com fdisk, como strings em 2 variáveis.
fdisk -l /home/documents/image-of-sd-card.img
Disk /home/documents/image-of-sd-card.img: 14,84 GiB, 15931539456 bytes, 31116288 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc680d152
Device Boot Start End Sectors Size Id Type
/home/documents/image-of-sd-card.img1 8192 655359 647168 316M c W95 FAT32 (LBA)
/home/documents/image-of-sd-card.img2 655360 31115263 30459904 14,5G 83 Linux
Os valores que eu precisaria são a última unidade de "Tamanho do setor" (512) e o tamanho final da segunda partição (31115263). Como conseguir isso? Eu preferiria uma solução baseada em Bash para poder integrá-la a um script Shell existente.
Como iniciante absoluto no Linux, apenas brinquei com alguns comandos greb, mas sem sucesso.
Aqui está uma explicação passo a passo para ajudá-lo em seu aprendizado de bash
Saída:
Explicação
raw_content=$(...)
salvará toda a saída em uma varwhile read i ... done <<< "$raw_content"
irá iterar linha por linha e definir o valor em i varif [[ "$i" == "Sector size"* ]];
perguntará se a string começa com ...echo "$i" | cut -d ' ' -f 7
irá dividir por um espaço e obter a coluna desejadaecho "$i" | awk -F' ' '{ print $3 }'
irádividir por vários espaços e obter a coluna desejadaPalestras recomendadas
Com
fdisk
instalado, você geralmente também temsfdisk
disponível, que é um fdisk "orientado para script". Você pode dar a ele a opção--json
(ou-J
) de gerar as informações em um formato mais estruturado (experimente apenas inserirsfdisk -J /path/to/device
para ver a saída inteira), que pode ser processado por um processador JSON ( jq por exemplo) que pode extrair com precisão o que você precisar. Use"$(...)"
para capturar a saída e atribuí-la a uma variável.Com mais variáveis, talvez você queira combinar as chamadas. Aqui está um exemplo:
Isso pode ser usado para extrair o tamanho do setor
A correspondência de padrão semelhante pode ser usada para extrair o segundo valor necessário.
Pode ser melhor se você encontrar alguma ferramenta orientada a scripts como
sfdisk
, e será mais seguro.Caso contrário, isso pode ser resolvido com a combinação de grep/sed/owk ou até mesmo por puro bash.
Explicações para
sed
o comando:-n
diz não imprimir parased
, whilep
é o comando de impressão.sed
o programa começa pelo chamado endereço\| <regular expression> |
que funciona como um seletor. O bloco seguinte{ ... }
é executado para as linhas matemáticas e contéms| <what> | <bywhat>|
onde solicitamos a substituição de qualquer<what> = .*/ *
(significando qualquer caractere(.) repetido-arbitrariamente(*
) seguido de barra(/) seguido de espaço( ) repetido-arbitrariamente(*
)). Substituímos<what>
pela string vazia. Em seguida, substituímos (s|...|..|
)<what>
= "bytes" junto com quaisquer espaços. Por fim, imprimimos (p
) o resultado.Explicação do
awk
comando: Para as linhas correspondentes ao endereço,/..../
o comandoprint
executado para imprimir a terceira$3
palavra na linha.--
Solução pura
bash
:Nota:
[ ... == ... ]
é diferente de[[ ... == ... ]]
.