我创建了一个脚本,它使用循环for loop
遍历 IBM 脚本来获取目录的大小。然后,该脚本将目录大小和路径输出到 Slack 通道,以便于查看。该程序可以运行,但 IBM 脚本的输出很大,需要格式化才能在 Slack 中轻松阅读。因此,我需要收集两条信息,这些信息将通过管道传输到两个单独的变量中,这些变量用于创建 Slack 消息。我的脚本如下所示:
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
将循环遍历所有子目录(一层深)并获取它们的大小。输出看起来像:
[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 函数将使用这两个变量。我正在努力弄清楚如何将这两个变量放入变量中。有人有解决办法吗?谢谢!
答案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
不支持{x,y}
/{x}
正则表达式间隔运算符(对于较早(而非古老)版本的,您可以在支持它们的环境中gawk
运行它POSIXLY_CORRECT=anything
尽管)尽管它已经成为标准超过 25 年了。对于这些,您需要替换[[:upper:]]{3}
为[[:upper:]][[:upper:]][[:upper:]]
.
答案2
我非常怀疑这就是您所需要的,但这逐字回答了您当前的问题。
第一部分(假设 GNUgrep
或兼容):
project="$(yourscript|grep -oE '[[:upper:]]{3}')"
第二部分:
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。