2

bash を使用して実行する負荷からダイナミクスを取得しようとしています。必要な文字列が得られるところまで来ました。ここから、変化する可能性のある特定の情報を引き出したいと思います。返される文字列は次のとおりです。

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

各数字の長さは異なる場合がありますが、全体的な構造は同じままです。私がやりたいことは、これらの数値を取得して、いくつかの bash 変数にロードできるようにすることです。

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

正規表現では、次のようにします。

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

私の変数で4つのグループを使用します。

4

5 に答える 5

4

Bash バージョン >= 3.2 で正規表現マッチングを使用できます。

[[ $line =~ ([[:digit:]]+).*([[:digit:]]+).*([[:digit:]]+).*([[:digit:]]+) ]]

RECORDS=${BASH_REMATCH[1]}
DELETED=${BASH_REMATCH[2]}
SKIPPED=${BASH_REMATCH[3]}
WARNING=${BASH_REMATCH[4]}
于 2010-04-25T00:35:03.103 に答える
3

組み込みreadコマンドはトリックを行います:

read TMP1 RECORDS TMP2 DELETED TMP3 SKIPPED TMP4 WARNING

更新:次も使用できますset

set $line
RECORDS=$2
DELETED=$4
SKIPPED=$6
WARNING=$8
于 2010-04-24T23:54:03.440 に答える
1

これは、いくつかの名前と値のペアを作成するだけで使用できるシェル関数です。あなたが言ったようにフォーマットされていることを前提としていますが、簡単に変更できます:

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
于 2010-04-25T02:45:40.510 に答える
0
#!/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
于 2010-04-25T03:12:59.097 に答える
0

次のような行の構造に応じて、「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
于 2010-04-25T00:03:11.630 に答える