実行すると、コマンドラインに次のようなものが出力されるプログラムがあります。
file test.test: 427 sentences, 2433 words, 1186 OOVs
0 zeroprobs, logprob= -4914.55 ppl= 862.603 ppl1= 8731.65
しかし、環境変数に数値862.603を保存したいだけです。プログラムの出力からその単一の数値を抽出するにはどうすればよいですか?
私がこれまでに見たすべての答えにはいくつかの欠陥があったので、私は先に進んでこれをミックスに追加すると思います:
これを行うにはいくつかの方法があります。
私が好む方法は、grepのperl拡張子(-P
)を使用することです。
var=$(myProgram | grep -oP 'ppl=\s*\K\d+\.\d+')
-o
フラグは、一致する文字列(この場合は探している番号)のみを出力するようにgrepに指示します。
これは(ほぼ)sputnickのソリューションと同じですが、ファイルからではなくパイプを介してプログラムから直接読み取るように調整したことに注意してください。
grepが得意とする特定の文字列を本質的に検索したいので、私はそのソリューションを好みます。唯一の問題は、perlregex拡張機能でのみサポートされているルックビハインドも実行したいということです。
したがって、grepがperl regex拡張機能をサポートしていない場合は、sedを使用します。
var=$(myProgram | sed 's/ppl=\s*\(\d\+\.\d\+\)/\1/')
これは、かなり一般的なgnusedを前提としています。gnu sedをお持ちでない場合は、次を使用してください。
var=$(myProgram | sed 's/ppl=[ \t]*\([0-9]\{1,\}\.[0-9]\{1,\})/\1/')
ここで重要なのは、このタスクを実行するために複数のパイプは絶対に必要ないということです。パイプを開くことは、新しいプロセスを開始することを意味し、これは費用がかかります。一般に、シェルでコーディングするときにタスクを実行するために必要な数のパイプを開く必要があります。
編集
それを指摘するだけです:sputnickの答えは、perl拡張機能が利用できる場合、あなたが望むものとほぼ同じです。彼と私の現在の唯一の違いは、小さな正規表現の変更です(とにかく、最終的にはニーズに合わせて自分自身を微調整する必要があります)。
$ var=$(<YOUR_COMMAND> | grep -oP "ppl= \K\d+\.\d+")
$ echo $var
862.603
ディストリビューションにgrep -P
オプションがない場合は、インストールする必要がありますpcregrep
編集:ニーズに合わせて投稿を編集しました:ファイルでgrepを使用していましたが、これでコマンドを実行できます。
Edit2:これはawk
それを行う方法です:
var=$(
<YOUR_COMMAND> |
awk '
/ppl=/{
for (i=0; i<NF; i++) {
if ($(i) ~ "ppl=" && $(i) > 1) {
print $(i+1)
}
}
}'
)
echo $var
これで試してください:
var=`./program | grep 'ppl=' | cut -d= -f3 | sed 's/ //g' | sed 's/ppl1//g'`
$ MY_ENV_VAR="$(myprogram |grep 'ppl= '|sed -r 's:^.*ppl= ([0-9\.]+).*:\1:'
)」
fgrep
必要な行だけawk
を取得し、必要な数だけを取得するために使用できます。
program | fgrep ppl= | awk '{ print $6 }'