bash:从行到变量的数字

时间:2013-10-30 07:37:03

标签: bash


我需要将特定行的编号设置为变量 在这种情况下:生成的文档(rsync)中有一行代码如下:

传输的文件数量: 23

var1=`grep -E '\<Number of files transferred: [0-9]+\>' /path/to/document.txt`<br>

让我上线。

echo $var1 | egrep -o "[0-9]+"

告诉我 23 我需要一种(好的)方法来获取变量中的数字。

谢谢!

3 个答案:

答案 0 :(得分:1)

使用Command Substitution

number=$(echo $var1 | egrep -o "[0-9]+")

变量number现在应该具有命令echo $var1 | egrep -o "[0-9]+"输出


如果您的grep支持PCRE,您可以说:

number=$(grep -oP '\bNumber of files transferred: \K[0-9]+\b' /path/to/document.txt)

答案 1 :(得分:0)

如果你知道前缀的长度,只需选择一个子串。

var1=${var1:29}

或者,使用不同的方法而不是grep

var1=$(sed -n -e '/.*\<Number of files transferred: ([0-9]\+)\>.*/\1/p' < /path/to/document.txt)

答案 2 :(得分:0)

三种替代方法:

  1. 您可以使用bash中的${WORD##PATTERN}参数扩展功能提取数字:

    RSYNC=/path/to/document.txt
    TRANSFERRED=$(grep -E '^Number of files transferred: [0-9]+$' -- "$RSYNC")
    FILE_COUNT=${TRANSFERRED##*: }
    
  2. 使用$IFS输入字段分隔符)和read命令以及 here string

    IFS=: read _ FILE_COUNT <<<"$TRANSFERRED"
    
  3. 使用sed代替grepas suggested by wich in another answer,但由于OS X的BSD-ish版本为sed,因此您需要编写命令像这样:

    COMMAND='s/^Number of files transferred: \([0-9]\{1,\}\)$/\1/p'
    FILE_COUNT=$(sed -n -e "$COMMAND" -- "$RSYNC")
    
  4. 但是,我认为一个重要的问题是,为什么要将rsync的输出存储在文件中?你真的需要保留它吗?如果没有,那么您可以将rsync的输出传递到子shell中,该子shell执行您需要执行的任何处理。例如,你可以做这样的事情:

    rsync --stats ... | {
        FILE_COUNT=unknown
        TOTAL_SIZE=unknown
        while IFS=: read KEY VALUE; do
            case "$KEY" in
                Number of files transferred) FILE_COUNT=$VALUE ;;
                Total file size) TOTAL_SIZE=$VALUE ;;
            esac
        done
        case "$FILE_COUNT" in
            1) echo "$FILE_COUNT file ($TOTAL_SIZE bytes) was transferred."
            *) echo "$FILE_COUNT files ($TOTAL_SIZE bytes) were transferred."
        esac
    }