AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 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

在 Linux 中从磁盘映像文件中提取输出值作为字符串[关闭]

  • 772
关闭。这个问题需要更加有针对性。目前不接受答案。

想要改进这个问题吗?通过编辑这篇文章来更新问题,使其仅关注一个问题。

16 小时前关闭。

改进这个问题

我有一个 .img 文件,我想从中提取使用 fdisk 派生的 2 个值,作为 2 个变量中的字符串。

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

我需要的值是“扇区大小”的最后一个单位(512)和第二个分区的结束大小(31115263)。如何实现这一目标?我更喜欢基于 Bash 的解决方案,这样我就可以将其集成到现有的 Shell 脚本中。

作为 Linux 的绝对初学者,我只是尝试了一些 greb 命令,但没有效果。

linux
  • 4 4 个回答
  • 52 Views

4 个回答

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

    这里有一步一步的解释来帮助你学习 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"
    

    输出:

    解释

    • raw_content=$(...)将所有输出保存在 var 中
    • while read i ... done <<< "$raw_content"将逐行迭代并设置i var中的值
    • if [[ "$i" == "Sector size"* ]];会询问字符串是否以...开头
    • echo "$i" | cut -d ' ' -f 7将按一个空格分开并为您提供所需的列
    • echo "$i" | awk -F' ' '{ print $3 }'将被几个空格分开并为您提供所需的列

    推荐讲座

    • 在 Bash 中,如何检查字符串是否以某个值开头?
    • 使用空格作为 cut 命令的分隔符
    • https://stackoverflow.com/a/66612752/3957754
    • 1
  2. pmf
    2023-08-19T21:43:26+08:002023-08-19T21:43:26+08:00

    安装后fdisk,您通常还可以sfdisk使用“面向脚本”的 fdisk。您可以为其提供--json( 或-J) 选项,以更结构化的格式输出信息(尝试仅输入sfdisk -J /path/to/device即可查看整个输出),然后可以由 JSON 处理器(例如jq )处理该信息,该处理器可以精确提取您想要的信息。需要。用于"$(...)"捕获输出并将其分配给变量。

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

    如果变量较多,您可能需要合并调用。这是一个例子:

    { 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

    这可用于提取扇区大小

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

    可以使用类似的模式匹配来提取第二所需值。

    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

    如果你找到一些像 类似的面向脚本的工具可能会更好sfdisk,而且会更安全。

    否则,这可以通过 grep/sed/owk 组合甚至纯 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---
    

    命令说明sed: -n表示不打印到sed,而p为打印命令。sed程序从所谓的地址开始\| <regular expression> |,该地址充当选择器。以下块{ ... }针对数学行执行,并包含s| <what> | <bywhat>|我们请求替换任何内容的位置<what> = .*/ *(意味着anychar(.) 重复任意( *) 后跟斜杠(/) 后跟空格( ) 重复任意( *))。我们<what>用空字符串替换。然后我们将 ( s|...|..|) <what>= "bytes" 与任何空格一起替换。最后我们打印 ( p) 结果。

    命令说明awk:对于与地址匹配的行,执行打印该行第三个字的/..../ 命令。print$3

    --

    纯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---"
    
    

    注意:[ ... == ... ]与 不同[[ ... == ... ]]。

    • 0

相关问题

  • 需要帮助通过 bsub 在 Windows 命令行上运行涉及多个单引号和双引号的命令

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve