Grep 3 大文字と数字を 2 つの変数に変換

Grep 3 大文字と数字を 2 つの変数に変換

IBMスクリプトを介してループを使用してfor loopディレクトリサイズを取得するスクリプトを作成しました。その後、スクリプトはディレクトリサイズとパスをSlackチャンネルに出力し、簡単に表示できます。プログラムは機能しますが、IBMスクリプトの出力が大きいため、Slackで読みやすいようにフォーマットする必要があります。したがって、Slackメッセージを生成するために使用される2つの別々の変数にリンクする2つの情報を収集する必要があります。私のスクリプトは次のとおりです

SIZE () {
  for dir in /path/to/dir/*
  do
    cd /usr/lpp/mmfs/samples/ilm/
    SLACKMESSAGE=$(./mmpolicy-du.sample "$dir" -t /mmfs1/.policytmp -g /mmfs1/.policytmp/ -N all -v -h)
    SLACK
  done
}

/path/to/dir/*親ディレクトリにも同様に適用されます。 IBMスクリプトは、./mmpolicy-du.sample "$dir" -t /mmfs1/.policytmp -g /mmfs1/.policytmp/ -N all -v -h すべてのサブディレクトリー(1レベルの深さ)を繰り返してサイズを取得します。出力は次のとおりです。

[I] 2018-05-31@16:32:55.798 Policy execution. 0 files dispatched.
[I] 2018-05-31@16:32:55.804 Policy execution. 0 files dispatched.
File system scan complete.
534.5M     total
mmapplypolicy du for /path/to/directory/SPI/ complete at Thu May 31 17:32:55 2018

534.5Mこれは最もきれいな出力ではないので、上記の例のディレクトリサイズをという変数と呼ばれるSIZESPIの変数にパイプしたいと思いますPROJECT。もちろん、ループとして、SIZE変数PROJECTは上記の例の各ディレクトリで変更されます/path/to/dir/。上記の関数から呼び出されたSlack関数は、これら2つの変数を使用します。これら2つの変数を変数に入れる方法を理解しようとしています。誰にも解決策はありますか?ありがとうございます!

答え1

一度に完了:

eval "$(yourscript | awk -v q=\' '
  $1 ~ /^[[:digit:]]+(\.[[:digit:]]+)?[MGT]$/ {
    print "SIZE=" $1
  }
  match($0, /[[:upper:]]{3}/) {
    print "PROJECT="q substr($0, RSTART, RLENGTH) q
  }')"

一部のawk実装(nawkSolaris以前mawkまたは以前のバージョン)は、/正規表現間隔演算子をgawkサポートしていません(以前(古代ではない)バージョンの場合は、それをサポートする環境で実行できます)。 25年以上。これを行うには、に変更する必要があります。{x,y}{x}gawkPOSIXLY_CORRECT=anything[[:upper:]]{3}[[:upper:]][[:upper:]][[:upper:]]

答え2

これがあなたに必要なものかどうか疑問です。しかし、これは現在の質問に対する答えです。

パート1(GNUgrepまたは互換仮定):

project="$(yourscript|grep -oE '[[:upper:]]{3}')"

2番目の部分:

size="$(yourscript|grep -oE '[[:digit:]]+(\.[[:digit:]]+)?[MGT]')"

組み合わせると、スクリプトを一度実行し、出力とgrepを保存し、保存した出力に割り当てる方が簡単です。

output="$(script)"
size="$(printf '%s\n' "$output"|grep -oE '[[:digit:]]+(\.[[:digit:]]+)?[MGT]')"
project="$(printf '%s\n' "$output"|grep -oE '[[:upper:]]{3}')"

一部の説明
grep -o- 全体行ではなく grep のオブジェクトのみを返す
-E- 拡張正規表現
[[:upper:]]- 大文字のみ一致 ([AZ]、ロケールではない)
{3}- 一致を正確に 3 つの連続文字に制限します。
[[:digit:]]- 数字と一致([0-9]、再ロケールに関係なし)
+- 1回以上一致
\.- 点と一致
(...)?- 0または1回一致 - これにより、小数点のない数値もキャプチャできます。
[xy]- アイテムと正確に一致します。 xまたはy。

関連情報