AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 76935210
Accepted
TimZed
TimZed
Asked: 2023-08-19 20:56:49 +0800 CST2023-08-19 20:56:49 +0800 CST 2023-08-19 20:56:49 +0800 CST

Extraia valores de saída do arquivo de imagem de disco como strings no Linux [fechado]

  • 772
Fechado . Esta questão precisa ser mais focada . No momento, não está aceitando respostas.

Quer melhorar esta questão? Atualize a pergunta para que ela se concentre em apenas um problema editando esta postagem .

Fechado há 16 horas .

Melhore esta questão

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.

linux
  • 4 4 respostas
  • 52 Views

4 respostas

  • Voted
  1. Best Answer
    JRichardsz
    2023-08-19T21:45:49+08:002023-08-19T21:45:49+08:00

    Aqui está uma explicação passo a passo para ajudá-lo em seu aprendizado de bash

    raw_content=$(fdisk -l /home/documents/image-of-sd-card.img)
    
    sector_size=
    second_partition_size=
    while read i 
    do 
    
        if [[ "$i" == "Sector size"* ]]; then
            echo ">>>>$i" 
            echo "$i" | cut -d ' ' -f 7
            sector_size=$(echo "$i" | cut -d ' ' -f 7)
        elif [[ "$i" == "/home/documents/image-of-sd-card.img2"* ]]; then
            echo ">>>>$i" 
            echo "$i" | awk -F' ' '{ print $3 }'
            second_partition_size=$(echo "$i" | awk -F' ' '{ print $3 }')        
        fi
    
    done <<< "$raw_content"
    
    echo -e "\nResults:"
    
    echo "sector_size: $sector_size"
    echo "second_partition_size: $second_partition_size"
    

    Saída:

    Explicação

    • raw_content=$(...)salvará toda a saída em uma var
    • while read i ... done <<< "$raw_content"irá iterar linha por linha e definir o valor em i var
    • if [[ "$i" == "Sector size"* ]];perguntará se a string começa com ...
    • echo "$i" | cut -d ' ' -f 7irá dividir por um espaço e obter a coluna desejada
    • echo "$i" | awk -F' ' '{ print $3 }'irádividir por vários espaços e obter a coluna desejada

    Palestras recomendadas

    • No Bash, como posso verificar se uma string começa com algum valor?
    • Use o espaço como delimitador com o comando cortar
    • https://stackoverflow.com/a/66612752/3957754
    • 1
  2. pmf
    2023-08-19T21:43:26+08:002023-08-19T21:43:26+08:00

    Com fdiskinstalado, você geralmente também tem sfdiskdisponí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 inserir sfdisk -J /path/to/devicepara 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.

    sectorsize="$(sfdisk -J /path/to/device | jq '.partitiontable.sectorsize')"
    part2size="$(sfdisk -J /path/to/device | jq '.partitiontable.partitions[1].size')"
    

    Com mais variáveis, talvez você queira combinar as chamadas. Aqui está um exemplo:

    { read sectorsize; read part2size; } < <(
      sfdisk -J /path/to/device | jq '.partitiontable | .sectorsize, .partitions[1].size'
    )
    
    • 0
  3. raghu
    2023-08-19T21:47:49+08:002023-08-19T21:47:49+08:00

    Isso pode ser usado para extrair o tamanho do setor

     size=$(fdisk -l /home/documents/image-of-sd-card.img |awk
    '/^Sector/ {print $4}')
    

    A correspondência de padrão semelhante pode ser usada para extrair o segundo valor necessário.

    second_end=$(fdisk -l /home/documents/image-of-sd-card.img |awk
     '/^img2/ {print $3}')
    
    • 0
  4. minorChaos
    2023-08-19T21:59:34+08:002023-08-19T21:59:34+08:00

    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.

    fdisk .... > tmpx;
    A="$(
        sed -n '\|Sector size (logical/physical)|{ s|.*/ *||; s| *bytes *||; p };'  tmpx
        )"
    B="$(  awk '/sd-card.img2/{print $3}'  tmpx  )"
    
    echo "The-results---$A---$B---"
    
    The-results---512---31115263---
    

    Explicações para sedo comando: -ndiz não imprimir para sed, while pé o comando de impressão. sedo 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ém s| <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 awkcomando: Para as linhas correspondentes ao endereço, /..../ o comando printexecutado para imprimir a terceira $3palavra na linha.

    --

    Solução pura bash:

    A="error"; B="error"; 
    while read a b c d e f g h  ; do 
        [ "$a,$b,$c,,$e,$f" == "Sector,size,(logical/physical):,,bytes,/" ] && A="$g";
        [[ "$a" == *sd-card.img2 ]] && B="$c"; 
    done < tmpx;
    echo "The-results---$A---$B---"
    
    

    Nota: [ ... == ... ]é diferente de [[ ... == ... ]].

    • 0

relate perguntas

  • Precisa de ajuda para executar um comando envolvendo várias aspas simples e duplas na linha de comando do Windows via bsub

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve