【问题标题】:repeating values in a string在字符串中重复值
【发布时间】:2016-01-18 20:56:43
【问题描述】:

我有一个 bash shell,它正在下拉内存值,以告诉我它们是否正常。如果内存好,它会返回 03。在系统中,内存量可能会有所不同,但比如说我有一组 12 个模块。 SNMP 将作为单个字符串返回:

03 03 03 03 03 03 03 03 03 03 03 03

03 表示没问题。 03 以外的任何东西都是问题。 bash 中是否有一种简单的方法来解析我猜想是空格分隔的列表,如果任何包含 03 以外的任何内容,则返回错误或返回 OK?

谢谢。

JR

【问题讨论】:

    标签: bash snmp


    【解决方案1】:

    iVal=`grep "03 03 03 03 03 03 03 03 03 03 03 03" 文件名`

    如果 iVal=0 你有一个马赫。如果没有,你没有匹配。

    请注意,这些是 grep 之前和行尾的重音符号(反勾号)。

    试试man grepman bash

    如果你想要更可配置的东西(不同长度的响应),你可以使用更通用的正则表达式,或者你可以使用awk 来解析一定长度的字符串(或变量数量)

    【讨论】:

    • iVal 不包含退出状态,如果您将其与命令替换结合使用,它包含命令的实际输出。
    • 这将与if [[ -n "$iVal" ]] 一起使用以检查失败或if [[ -z "$iVal" ]] 以检查成功。或者使用“grep -c”和整数比较输出是否大于0。
    【解决方案2】:

    你可以用awk解决这个问题:

     awk '{for (i=1;i<=NF;i++) if ($i!="03") print "fail"}' <yourfile>
    

    或类似的东西。本质上,这将遍历记录中的每个字段(字段是记录中的数字之一),检查它是否为“03”,如果不是,则打印“失败”。

    【讨论】:

      【解决方案3】:

      如果值像您的示例一样以空格分隔,则默认的 $IFS 值将为您拆分字符串。所以,你可以这样做:

      status_string=$(snmpwalk arg arg arg)
      ok=1
      for status in $status_string
      do
        [[ "${status:-}" != "03" ]] && ok=0
      done
      

      如果数据在文件中,您可以使用$(&lt;/path/to/file) 将文件内容放入内存。如果值是换行符分隔、空格分隔或制表符分隔,这将起作用。或者这些字符的某种组合。

      如果$var 为空或未定义,"${var:-}" 表达式将返回一个空字符串,从而防止脚本抱怨空变量。我建议任何时候变量可能为空的结构(假设一个支持它的 shell,它应该是任何常见的 bourne 样式 shell)。

      【讨论】:

      • 可能应该澄清几件事。当我提到内存时,我指的是查询内存以查看它是否有任何故障的 SNMP 调用。所以没有我正在读取的物理文件。我正在执行 SNMP 调用: result=$(snmpwalk -Oqv -v2c -c public $1 ${!calculatedvariables[count]}) 将其存储在结果中,然后尝试解析其中的任何内容以确保它都是 03 空间03 空间 03 空间...值或是否有任何其他值。
      • 当我提到将值放入内存时,我的意思是放入变量中。 :) 将你的snmpwalk 命令粘贴到我有snmpget or whatever 的位置,用return 替换exit,并将代码包装在function checkmemory {} 之类的东西中。如果我对这将是多么容易做太多假设,请添加另一条评论,我会将示例扩展为更完整的内容。
      • 我稍微简化了这个例子,让它更有用。
      • 做得很好。无法投票或接受作为答案,但感谢 dannysauer。
      猜你喜欢
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      相关资源
      最近更新 更多