代码之家  ›  专栏  ›  技术社区  ›  Russ Bradberry

如何从字符串中提取信息

  •  2
  • Russ Bradberry  · 技术社区  · 15 年前

    我正在尝试从使用bash运行的负载中提取动力学。我已经到了一个点,我得到了我想要的字符串,现在从这里我想拉一些可以改变的信息。返回的字符串如下:

    Records: 2910 Deleted: 0 Skipped: 0 Warnings: 0
    

    每个数字的长度可以也会有所不同,但总体结构将保持不变。我想做的是能够得到这些数字并将它们加载到一些bash变量中,即:

    RECORDS=??
    DELETED=??
    SKIPPED=??
    WARNING=??
    

    在regex中,我会这样做:

    Records: (\d*?) Deleted: (\d*?) Skipped (\d*?) Warnings (\d*?)
    

    在我的变量中使用4个组。

    5 回复  |  直到 15 年前
        1
  •  4
  •   Dennis Williamson    15 年前

    可以在bash版本中使用regex匹配>=3.2:

    [[ $line =~ ([[:digit:]]+).*([[:digit:]]+).*([[:digit:]]+).*([[:digit:]]+) ]]
    
    RECORDS=${BASH_REMATCH[1]}
    DELETED=${BASH_REMATCH[2]}
    SKIPPED=${BASH_REMATCH[3]}
    WARNING=${BASH_REMATCH[4]}
    
        2
  •  3
  •   Bolo    15 年前

    内置的 read 命令可以做到这一点:

    read TMP1 RECORDS TMP2 DELETED TMP3 SKIPPED TMP4 WARNING
    

    更新 :您也可以使用 set :

    set $line
    RECORDS=$2
    DELETED=$4
    SKIPPED=$6
    WARNING=$8
    
        3
  •  1
  •   camh    15 年前

    这里有一个shell函数,您可以使用它来创建许多名称/值对。它假定事情的格式与您所说的一样,但很容易更改:

    parseline() {
        while [ $# -ge 2 ] ; do
            eval $(echo $1 | tr -d : | tr '[a-z]' '[A-Z]')="$2"
            shift 2
        done
    }
    

    按如下方式执行:

    $ parseline Records: 2910 Deleted: 0 Skipped: 0 Warnings: 0
    $ echo $RECORDS
    2910
    $ echo $WARNINGS
    0
    
        4
  •  0
  •   Ricardo Marimon    15 年前

    根据线的结构,可以尝试使用“sed”或“cut”:

    #!/bin/sh                                                                       
    
    DYNAMIC="Records: 2910 Deleted: 1 Skipped: 2 Warnings: 3"
    
    RECORDS=`echo "$DYNAMIC" | sed 's/.*Records: \([0-9]*\).*/\1/g'`
    DELETED=`echo "$DYNAMIC" | sed 's/.*Deleted: \([0-9]*\).*/\1/g'`
    SKIPPED=`echo "$DYNAMIC" | sed 's/.*Skipped: \([0-9]*\).*/\1/g'`
    WARNINGS=`echo "$DYNAMIC" | sed 's/.*Warnings: \([0-9]*\).*/\1/g'`
    
    echo "Records $RECORDS"
    echo "Deleted $DELETED"
    echo "Skipped $SKIPPED"
    echo "Warnings $WARNINGS"
    
    echo "$DYNAMIC" | cut -d " " -f2
    echo "$DYNAMIC" | cut -d " " -f4
    echo "$DYNAMIC" | cut -d " " -f6
    echo "$DYNAMIC" | cut -d " " -f8
    
        5
  •  0
  •   ghostdog74    15 年前
    #!/bin/bash
    s="Records: 2910 Deleted: 0 Skipped: 0 Warnings: 0"
    s=${s//: /=}
    for i in $(printf ${s// /"\n"})
    do
     eval $i
    done
    
    echo "Records: $Records"
    echo "Deleted: $Deleted"
    echo "Skipped: $Skipped"
    echo "Warnings: $Warnings"
    

    输出

    $ ./shell.sh
    Records: 2910
    Deleted: 0
    Skipped: 0
    Warnings: 0