1


変数に設定された特定の行の番号が必要です。
この場合: 生成されたドキュメント (rsync) に次のような行があります。

転送されたファイルの数: 23

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

私にラインを取得します。

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

23を表示します。
変数で Number を取得する (良い) 方法が必要です。

ありがとう!

4

3 に答える 3

1

コマンド置換を使用:

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

変数には、コマンドの出力numberが含まれているはずです。echo $var1 | egrep -o "[0-9]+"


grepPCRE をサポートしている場合は、次のように言えます。

number=$(grep -oP '\bNumber of files transferred: \K[0-9]+\b' /path/to/document.txt)
于 2013-10-30T07:39:41.463 に答える
0

3 つの代替アプローチ:

  1. ${WORD##PATTERN}パラメータ展開機能を使用してbash、数値を抽出できます。

    RSYNC=/path/to/document.txt
    TRANSFERRED=$(grep -E '^Number of files transferred: [0-9]+$' -- "$RSYNC")
    FILE_COUNT=${TRANSFERRED##*: }
    
  2. $IFS(入力フィールド区切り記号read) をコマンドとヒア文字列と共に使用します。

    IFS=: read _ FILE_COUNT <<<"$TRANSFERRED"
    
  3. 別の回答の wich で示唆されているように、sedの代わりに使用しますが、OS X には の BSD っぽいバージョンがあるため、次のようにコマンドを記述する必要があります。grepsed

    COMMAND='s/^Number of files transferred: \([0-9]\{1,\}\)$/\1/p'
    FILE_COUNT=$(sed -n -e "$COMMAND" -- "$RSYNC")
    

しかし、重要な質問は、なぜ出力をrsyncファイルに保存するのかということだと思います。本当に保管する必要がありますか?そうでない場合は、rsync必要な処理を行うサブシェルに出力をパイプできます。たとえば、次のようなことができます。

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
}
于 2013-10-30T09:50:22.147 に答える