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

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

IBM スクリプトをループしてディレクトリのサイズを取得するスクリプトを作成しましたfor loop。スクリプトは、ディレクトリのサイズとパスを Slack チャネルに出力して簡単に表示できるようにします。プログラムは動作しますが、IBM スクリプトの出力は大きく、Slack で読みやすいようにフォーマットする必要があります。そのため、2 つの情報を収集して、Slack メッセージの作成に使用される変数とともに 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という変数にパイプしSIZE、 をSPIという別の変数にパイプしたいと思いますPROJECT。もちろん、ループなので、SIZEPROJECT変数は上記の の例内の各ディレクトリで変化します/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
  }')"

や Solarisなどの一部awkの実装、または の古いバージョンでは、正規表現間隔演算子/ が25 年以上にわたって標準となっているにもかかわらず、サポートされていないことに注意してください ( の古い (古くない) バージョンの場合は、 環境で とともに実行することでサポートできます)。これらのバージョンでは、を に置き換える必要があります。nawkmawkgawk{x,y}{x}gawkPOSIXLY_CORRECT=anything[[:upper:]]{3}[[:upper:]][[:upper:]][[:upper:]]

答え2

これが必要なことかどうかは非常に疑問ですが、これは現在の質問にそのまま答えています。

最初の部分 (GNUgrepまたは互換バージョンを想定):

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

第二部:

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

これらを組み合わせると、スクリプトを 1 回実行し、出力を保存して、保存した出力に対して 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 のいずれか 1 つに正確に一致します。

関連情報