GO解析 - Linux 指令之 lsblk

版本

lsblk --version
lsblk from util-linux 2.38.1

代码

lsblkParser.go

package utilstype LSBlkItem struct {Name       string // 名称Major      uint   // 主版本Minor      uint   // 此版本Removable  bool   // 可移除deWritable   bool   // 可写的Size       uint   // 大小字节Type       string // 类型, part是上一个磁盘的一部分,disk就是磁盘MountPoint string // 挂载点Parent *LSBlkItem // 父挂载点
}type LSBlkParser struct {
}

lsblkParser_linux.go

package utilsimport ("errors""os/exec""strconv""strings"
)func (l *LSBlkParser) GetSizes(devNames []string) ([]LSBlkItem, error) {items, err := l.getItems()if nil != err {return nil, err}return items, err
}func (l *LSBlkParser) getItems() ([]LSBlkItem, error) {/*-b 以字节显示磁盘大小-p 打印设备完整路径*/cmd := exec.Command("lsblk", "-b", "-p")bs, err := cmd.CombinedOutput()if nil != err {return nil, err}lines := strings.SplitN(string(bs), "\n", -1)var (isChild boolparent  *LSBlkItemitems   = make([]LSBlkItem, 0))for i, line := range lines {var item LSBlkItemif 0 == i || 0 >= len(line) {continue} // 第一行是标题行, 跳过item, isChild, err = l.getItem(line)if nil != err {return nil, err}if isChild {item.Parent = parent}items = append(items, item)if !isChild {parent = &items[len(items)-1]}}return items, err
}func (l *LSBlkParser) getItem(line string) (item LSBlkItem, isChild bool, err error) {var (itemMinCnt = 6 // 字符串分解之后最少会有多少个//itemMaxCnt = 7currItemCnt = 0)/*NAME              MAJ:MIN RM        SIZE RO TYPE MOUNTPOINTS/dev/sda            8:0    1           0  0 disk/dev/sdb            8:16   1 31104958464  0 disk/dev/mmcblk0      179:0    0  7818182656  0 disk├─/dev/mmcblk0p1  179:1    0   536870912  0 part /boot/firmware└─/dev/mmcblk0p2  179:2    0  7277117440  0 part //dev/mmcblk0boot0 179:32   0     4194304  1 disk/dev/mmcblk0boot1 179:64   0     4194304  1 disk*/strs := strings.Fields(line)currItemCnt = len(strs)if itemMinCnt > currItemCnt {return item, false, errors.New("item count not enough")}for i, str := range strs {switch i {case 0:if item.Name, err = l.getName(str); nil != err {return}case 1:if item.Major, item.Minor, err = l.getMajorMinor(str); nil != err {return}case 2:if item.Removable, err = l.getRemovable(str); nil != err {return}case 3:if item.Size, err = l.getSize(str); nil != err {return}case 4:if item.Writable, err = l.getWritable(str); nil != err {return}case 5:if item.Type, isChild, err = l.getType(str); nil != err {return}case 6:if item.MountPoint, err = l.getMountPoint(str); nil != err {return}}}return
}func (l *LSBlkParser) getName(str string) (string, error) {for i := range str {if str[i] != '/' {continue}str = str[i:]return str, nil}return str, nil
}func (l *LSBlkParser) getMajorMinor(str string) (major uint, minor uint, err error) {var temp uint64strs := strings.Split(str, ":") // 8:0for i := range strs {if temp, err = strconv.ParseUint(strs[i], 10, 32); nil != err {return}if 0 == i {major = uint(temp)} else if 1 == i {minor = uint(temp)} else {break}}return
}func (l *LSBlkParser) getRemovable(str string) (bool, error) {temp, err := strconv.ParseUint(str, 10, 64)if nil != err {return false, err}if 0 == temp {return false, nil} else {return true, nil}
}func (l *LSBlkParser) getSize(str string) (uint, error) {temp, err := strconv.ParseUint(str, 10, 64)if nil != err {return 0, err}return uint(temp), nil
}func (l *LSBlkParser) getWritable(str string) (bool, error) {temp, err := strconv.ParseUint(str, 10, 64)if nil != err {return false, err}if 0 == temp {return true, nil} else {return false, nil}
}func (l *LSBlkParser) getType(str string) (typ string, isChild bool, err error) {typ = strif 0 == strings.Compare(str, "disk") {isChild = false} else if 0 == strings.Compare(str, "part") {isChild = true}return
}func (l *LSBlkParser) getMountPoint(str string) (string, error) {return str, nil
}

测试

main.go

package mainimport ("encoding/json""fmt""pi_gpio_test/utils"
)func main() {var lsblkParser utils.LSBlkParseritems, err := lsblkParser.GetSizes([]string{"/dev/sda", "/dev/sdb",})if nil != err {fmt.Println(err)return}for _, item := range items {bs, err := json.Marshal(item)fmt.Println(string(bs), err)}
}

结果

{“Name”:“/dev/sda”,“Major”:8,“Minor”:0,“Removable”:true,“Writable”:true,“Size”:0,“Type”:“disk”,“MountPoint”:“”,“Parent”:null}
{“Name”:“/dev/mmcblk0”,“Major”:179,“Minor”:0,“Removable”:false,“Writable”:true,“Size”:3523215360,“Type”:“disk”,“MountPoint”:“”,“Parent”:null}
{“Name”:“├─/dev/mmcblk0p1”,“Major”:179,“Minor”:1,“Removable”:false,“Writable”:true,“Size”:536870912,“Type”:“part”,“MountPoint”:“/boot/firmware”,“Parent”:{“Name”:“/dev/mmcblk0”,“Major”:179,“Minor”:0,“Removable”:false,“Writable”:true,“Size”:3523215360,“Type”:“disk”,“MountPoint”:“”,“Parent”:null}}
{“Name”:“└─/dev/mmcblk0p2”,“Major”:179,“Minor”:2,“Removable”:false,“Writable”:true,“Size”:2982150144,“Type”:“part”,“MountPoint”:“/”,“Parent”:{“Name”:“/dev/mmcblk0”,“Major”:179,“Minor”:0,“Removable”:false,“Writable”:true,“Size”:3523215360,“Type”:“disk”,“MountPoint”:“”,“Parent”:null}}
{“Name”:“/dev/mmcblk0boot0”,“Major”:179,“Minor”:32,“Removable”:false,“Writable”:false,“Size”:4194304,“Type”:“disk”,“MountPoint”:“”,“Parent”:null}
{“Name”:“/dev/mmcblk0boot1”,“Major”:179,“Minor”:64,“Removable”:false,“Writable”:false,“Size”:4194304,“Type”:“disk”,“MountPoint”:“”,“Parent”:null}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法基础实验】图论-最小生成树Prim的延迟实现

最小生成树-Prim的延迟实现 理论基础 树的基本性质 用一条边连接树中的任意两个顶点都会产生一个新的环; 从树中删去一条边将会得到两棵独立的树。 切分定理的定义 定义。图的一种切分是将图的所有顶点分为两个非空且不重叠的两个集合。横切边 是一条连接两个属…

华为5700配置

恢复出厂设置,清空配置 1、更改名字 system-view sysname tp-10-50-01-04 2、配置管理接口 int vlan 1 ip add 10.50.1.4 255.255.254.0 quit 2、链路汇聚 interface eth-trunk 1 mode lacp quit 3、绑定端口 interface eth-trunk 1 trunkport gigabitethernet …

RTSP,RTP,RTCP

机器学习 Machine Learning(ML) 深度学习(DL,Deep Learning) CV计算机视觉(computer vision) FFMPEG,MPEG2-TS,H.264,H.265,AAC rstp,rtp,rtmp,webrtc onvif,gb28181 最详细的音…

chrome和drive安装包路径

Chrome for Testing availability (googlechromelabs.github.io) 下载Stable下面的包哈

乘用车整车太阳光模拟加速老化试验太阳光模拟器

1.阳光模拟试验介绍 太阳辐射会对室外停放的汽车内外饰件产生热效应和光化学效应,影响汽车内外饰件的外观、性能,对汽车质产生不利影响。按照汽车产环境试验标准的要求,汽车在研制定型之前应进行太阳辐射试验,以考虑其对太阳辐射环…

酷我音乐车机版+v6.0.1.0车机共存会员版【附带安装包下载地址】

简介 很多车机的酷我音乐app有限制,不能完全使用酷我音乐的所有功能。我这里分享一个可以使用全部功能的酷我音乐app,大家可以自行下载。 界面预览 软件下载地址【转存到自己的网盘后即可下载】 网盘地址:https://pan.xunlei.com/s/VNwgzNV…

架设WebSocket的最后一环,如何设置好nginx反向代理

WebScoket都已经完工快一个月,经过一段时间的测试,公司还是准备把服务器换到鹅厂,用EO来解决CDN内容分发和DDOS防护问题,由于EO并不支持URL 路径转发,只支持转发到一个站点的80或则443端口,如果想做路径分发…

设计模式 --6组合模式

文章目录 组合模式应用场景组合模式概念组合模式结构图透明方式和安全方式什么时候使用组合模式公司管理系统使用 组合模式来构架组合模式的好处 组合模式应用场景 整体和部分可以被一致性对待 比如人力资源部 财务部的管理功能可以复用于分公司的功能 可以引入一种 树状的结构…

Springboot+Vue项目-基于Java+MySQL的教学资料管理系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

Linux基础——Linux开发工具(下)_make/makefile

前言:在经过前面两篇学习,大家对Linux开发工具都有一定的了解,而在此之前最重要的两个工具就是vim,gcc。 如果对这两个工具不太了解,可以先阅读这两篇文章: Linux开发工具 (vim) Linux开发工具 (gcc/g) 首先…

IoTDB入门教程——导读

Apache IoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统。 Apache IoTDB 采用轻量式架构,具有高性能和丰富的功能,并与Apache Hadoop、Spark和Flink等进行了深度集成,可以满足工业物联网领…

安卓adb 命令查看程序日志

gcat日志导出到文件 在Android设备上,你可以使用logcat命令将日志导出到文件中。打开终端或者命令行工具,然后输入以下命令: adb logcat -d > logcat.txt这条命令会将当前设备的logcat日志输出到名为logcat.txt的文件中。-d参数是用来确…

数据挖掘之基于K近邻算法的原油和纳斯达克股票数据预测分析

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在当今日益复杂的金融市场中,准确地预测原油价格和纳斯达克股票市场的走势对于投资者、政…

【JAVA】part5-Java集合

Java 集合 Java集合概述 Java数组的局限性 数组初始化后大小不可变;数组只能按索引顺序存取。 Java的java.util包主要提供了以下三种类型的集合: List:一种有序列表的集合,例如,按索引排列的Student的List&#xff1b…

代码随想录算法训练营DAY43|C++动态规划Part5|1049.最后一块石头的重量II、494.目标和、474.一和零

文章目录 1049.最后一块石头的重量II思路CPP代码 494.目标和回溯算法抽象成01背包问题CPP代码本题总结 474.一和零思路CPP代码 1049.最后一块石头的重量II 力扣题目链接 文章链接:1049.最后一块石头的重量II 视频链接:这个背包最多能装多少?L…

Vue3 + TS + Element-Plus 封装的 Dialog 弹窗组件

弹窗组件中自定义了表头增加了全屏&#xff0c;svg-icon 没有的话可能会报错&#xff0c;换成自己的图标就可以 <template><el-dialog:dialogHeight"dialogHeight":title"dialogTitle"class"dialog min-w-70"v-model"dialogVisib…

8 聚类算法

目录 0 背景 1 Kmeans 1.1 聚类数量k的确定 2 DBSCAN 2.1 三个点 2.2 算法流程 3 层次聚类 3.1 过程 4 基于分布的聚类:高斯混合模型 0 背景 聚类算法是一种无监督学习技术&#xff0c;用于将数据集中的数据点划分为不同的组或簇&#xff0c;使得同一组内的数据点彼此相…

nginx缓存清理

背景 昨天打开我的gpt镜像网站&#xff0c;意外发现静态图片资源全都无法获取了 CoCo-AI 一番排查下来&#xff0c;发现是引用的cdn链接失效了 且cdn源是属于七牛云的&#xff0c;且不再维护&#xff0c;于是果断切换到cloudflare export function getEmojiUrl(unified: str…

Qt简单离线音乐播放器

有上传本地音乐文件&#xff0c;播放&#xff0c;暂停&#xff0c;拖拉进度条等功能的播放器。 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QMediaPlayer> #include <QFileDialog> #include <QTime&g…

【Leetcode每日一题】 分治 - 排序数组(难度⭐⭐)(69)

1. 题目解析 题目链接&#xff1a;912. 排序数组 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 归并排序&#xff08;Merge Sort&#xff09;是一种采用“分而治之”&#xff08;Divide and Conquer&#xff09;策略…