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
これは最もきれいな出力ではないので、上記の例のディレクトリサイズをという変数と呼ばれるSIZE
別SPI
の変数にパイプしたいと思います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
実装(nawk
Solaris以前mawk
または以前のバージョン)は、/正規表現間隔演算子をgawk
サポートしていません(以前(古代ではない)バージョンの場合は、それをサポートする環境で実行できます)。 25年以上。これを行うには、に変更する必要があります。{x,y}
{x}
gawk
POSIXLY_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。