Grep 3 将大写字母和数字转换为两个变量

Grep 3 将大写字母和数字转换为两个变量

我创建了一个脚本,它使用循环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。当然,作为一个循环,SIZEPROJECT变量将在上面示例中的每个目录上发生变化/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。

相关内容