专栏首页机器学习与系统golang处理文本小计

golang处理文本小计

很简单的解决方案,原文格式更加,见笑。

Env

  • linux 64bit
  • go version go1.7.4 linux/amd64
  • physical machine
  • smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-327.36.2.el7.x86_64] (local build)

任务

使用smartctl命令收集物理机上的硬盘信息。需要的硬盘信息如下:

  • date: ‘2016-02-09’, string
  • serial_number: MJ0351YNG9Z0XA, string
  • model: Hitachi HDS5C3030ALA630, string
  • capacity_bytes: 3000592982016, string
  • normalize: 100, int
  • raw: 32296, string

以上需要的信息都可以通过smartctl配合相关参数拿到,但是格式是很原始,需要我们根据需求抽取出真正需要的信息。

比如normalizeraw是硬盘的属性信息,可通过smartctl -A device获取:

➜  ~ sudo smartctl -A /dev/sda
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-327.36.2.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
 1 Raw_Read_Error_Rate     0x000f   118   099   006    Pre-fail  Always       -       199795992
 3 Spin_Up_Time            0x0003   097   097   000    Pre-fail  Always       -       0
 4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       149
 5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
 7 Seek_Error_Rate         0x000f   077   060   030    Pre-fail  Always       -       54764573
 9 Power_On_Hours          0x0032   089   089   000    Old_age   Always       -       9792
10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       149
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   099   000    Old_age   Always       -       2 2 2
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   060   055   045    Old_age   Always       -       40 (Min/Max 26/40)
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       25
193 Load_Cycle_Count        0x0032   098   098   000    Old_age   Always       -       4708
194 Temperature_Celsius     0x0022   040   045   000    Old_age   Always       -       40 (0 6 0 0 0)
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       9049h+51m+35.226s
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       4749106878
242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       126575500815

厂商这类静态信息可通过sudo smartctl -i device获取:

➜  ~ sudo smartctl -i /dev/sda
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-327.36.2.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org=== START OF INFORMATION SECTION ===
Model Family:     Seagate Barracuda 7200.14 (AF)
Device Model:     ST1000DM003-1ER162
Serial Number:    W4Y3Z28A
LU WWN Device Id: 5 000c50 08a2c464e
Firmware Version: CC46
User Capacity:    1,000,204,886,016 bytes [1.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    7200 rpm
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-2, ACS-3 T13/2161-D revision 3b
SATA Version is:  SATA 3.1, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Tue Feb  7 17:53:34 2017 CST==> WARNING: A firmware update for this drive is available,
see the following Seagate web pages:
http://knowledge.seagate.com/articles/en_US/FAQ/207931en
http://knowledge.seagate.com/articles/en_US/FAQ/223651enSMART support is: Available - device has SMART capability.
SMART support is: Enabled

我们该如何把里面的数据抽取出来呢?

想到的方法

  • 正则表达式
  • strings(golang stdlib):处理字符串,分割、删除等
  • strconv (golang stdlib):处理字符串转换。
  • os/exec:执行smartctl脚本,获取输出

注意事项

  • 对于格式确定的文本,尽量根据格式过滤掉不需要的数据,只保留需要的数据。
lines := "
   data1\n data2\n needed1\n needed2\n
needed := strings.Split(lines, " ")
  • 对于分割,通常strings.Fields()优于strings.Split()。
package mainimport(  "strings"
 "fmt")func main() {
 lines := "194 Temperature_Celsius     0x0022   037   045   000    Old_age   Always       -       37 (0 6 0 0 0)"
 useSplit(lines)
 useFields(lines)
}func useSplit(lines string) {
 line := strings.Split(lines, " ")
 fmt.Println(line)
 fmt.Println(len(line))
}func useFields(lines string) {
 line := strings.Fields(lines)
 fmt.Println(line)
 fmt.Println(len(line))
}/*
output
➜  gist go run main.go
[194 Temperature_Celsius     0x0022   037   045   000    Old_age   Always       -       37 (0 6 0 0 0)]
42
[194 Temperature_Celsius 0x0022 037 045 000 Old_age Always - 37 (0 6 0 0 0)]
15
*/
  • exec获取bash script的输出信息默认结尾是带一个\n换行符的,要记得处理掉:
package mainimport(  "os/exec"
 "os"
 "fmt")func main() {
 devices := getDevices()
 fmt.Println(devices)
 fmt.Println(len(devices))
}func getDevices() []string {  
    ret, err := exec.Command("/sbin/smartctl", "--scan").Output()     if err != nil {
        log.Println("Execute /sbin/smartctl --scan error: %v", err)
        os.Exit(-1)
    }      linest := strings.Split(string(ret), "\n")
    lines := linest[:len(linest)-1] // remove last extra line with output of bash command
    var devList = []string{}     for _, line := range lines {
        device := strings.Fields(line)[0]
        devList = append(devList, device)
    }      return devList
}/*
remove extra line
[/dev/sda]
1
not remove extra line
[/dev/sda ]
2
*/

本文分享自微信公众号 - 机器学习与系统(aimlsystem),作者:adolphlwq

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-02-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 文本处理小记

    在平时的测试过程中,经常会遇到各种文本处理的问题,于是把遇到的常用的文本处理命令和方法进行了总结和整理。

    用户5521279
  • Python文本处理2个小案例(文本嗅探与关键词占比统计)

    问题描述:有一些句子和一些关键词,现在想找出包含至少一个关键词的那些句子(文本嗅探),可以参考print('='*30)之前的代码。如果想进一步计算每个句子中的...

    Python小屋屋主
  • Linux文本处理

    sed适合用于对大文件进行正则替换输出 其处理是实时显示(从文件读取一行匹配一行,结果输出) 不会修改原文件(添加g标记为全部替换,不添加为每行替换首个匹配项)

    歪歪梯
  • Linux文本处理

    cat 命令可以用来显示文本文件的内容(类似于 DOS 下的 type 命令),也可以把几个文件内容附加到另一个文件中,即连接合并文件。

    织幻妖
  • pandas文本处理

    py3study
  • 006-golang中XML文件的处理

    data),那么,字符数据会被累加到struct中第一个有tag为”,chardata”的字段。struct字段的类型可以是string或[]byte。如果没有...

    上善若水.夏
  • 自然语言处理--文本处理

    自然语言处理的目的是让机器试图理解和处理人类的文字。通常来说,人的语言是冗余的,含有歧义的,而机器是准确的,无歧义的,要让机器理解,这之间存在一个转换的问题。 ...

    linxinzhe
  • 文本处理时需小心驶得万年船

    sra数据库的文件的srr开头的ID需要以gsm开通的id进行中转才能对应到真正的样本处理信息。

    生信技能树
  • 编程小技巧之 Linux 文本处理命令

    合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也。合理的利用 Linux 的命令行工具,可以提高我们的工作效率。

    程序员历小冰
  • 编程小技巧之 Linux 文本处理命令

    合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也。合理的利用 Linux 的命令行工具,可以提高我们的工作效率。

    Bug开发工程师
  • 编程小技巧之 Linux 文本处理命令

    合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也。合理的利用 Linux 的命令行工具,可以提高我们的工作效率。

    程序员历小冰
  • Linux文本处理命令

    章鱼喵
  • Python进阶-文本处理

    CSV 通常用于在电子表格软件和纯文本之间交互数据;CSV 文件内容仅仅是一些用逗号分隔的原始字符串值。

    小团子
  • Python 文本处理介绍

    文本处理,在Python中有很多方法,最常见的有正则表达式,标准库的字符串处理方法。当然除了常用的方法外,还可以使用NLTK自然语言工具包处理字符串、使用机器学...

    TalkPython
  • assign之python文本处理

    1.python在处理文本时,在遇到列表中的两数相加时,需要先将其转化为float类型;若转换失败,多半是因为float在转换int与string或str时,字...

    py3study
  • 文本处理工具 - TextBlob

    TextBlob是一个用Python编写的开源的文本处理库。它可以用来执行很多自然语言处理的任务,比如,词性标注,名词性成分提取,情感分析,文本翻译,等等。你可...

    种花家的奋斗兔
  • Linux 文本处理命令

    最近在使用 BASH 进行处理 文本文件的时候,对于文本处理真的是力不从心,今天进行搜集一下linux 中文本处理相关的命令,这样你在进行书写shell 脚本的...

    xuyaowen
  • Shell 文本处理命令

    对文件内容进行去重 如果文件内容有很多重复的,需要进行去重。sort也是支持的,可以通过-u参数使用

    剧终
  • 编程小技巧之 Linux 文本处理命令(二)

    合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也。合理的利用 Linux 的命令行工具,可以提高我们的工作效率。

    程序员历小冰

扫码关注云+社区

领取腾讯云代金券