在一行中获取egrep -o 输出

在一行中获取egrep -o 输出

我们试图仅从下面的输出中获取数据,我们尝试使用egrep命令排除数据,但我们获取的数据位于不同的行中,我如何获取一行中的数据。

Total: 44.75TB   Used: 0.44TB    Available:42.04TB       Usage(5% System alocation included):6.07%

这是要求

44.75   0.44    42.04       6.07

我们尝试的是下面的命令和输出

# cat output| egrep -o "[+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9]"
44.75
0.44
42.04
6.07

答案1

看起来您想获取之后的所有值:并使用空格或制表符将它们连接起来

perl是一种选择

$ perl -lne 'print join "\t",/:\h*\K[^ ]+/g' output
44.75TB 0.44TB  42.04TB 6.07%
  • /:\h*\K[^ ]+/g:将获得出现在 a和可选水平空格 之后的非空格字符
    • 如果字段分隔可以有制表符,请使用\H而不是[^ ]
  • join "\t",将使用制表符作为分隔符连接匹配的字符串


仅获取数字

$ perl -lne 'print join "\t",/:\h*\K[\d.]+/g' output
44.75   0.44    42.04   6.07
  • 假设数字仅包含数字和小数点,并且不检查有效性,它将匹配紧随其后的 Even 等1.324.4以及可选空格...:

答案2

我们可以将输入行视为多个记录,每个记录由两个或多个空格分隔。每个记录可以根据冒号及其后的任何单个空格分为两个字段。我们希望每个这样的记录中有第二个字段。

使用 GNU awk(或mawk,但不nawk喜欢将正则表达式作为记录分隔符):

$ awk -vRS="   *|\n" -vFS=": ?" -vORS=" " '{ print $2 } END { printf("\n") }' data.in
44.75TB 0.44TB 42.04TB 6.07%
  • RS=" *|\n"将记录分隔符设置为两个或多个空格或换行符。这分为Total: 44.75TB Used: 0.44TB两个记录,Total: 44.75TBUsed: 0.44TB
  • FS=": ?"将字段分隔符设置为冒号,可以选择后跟一个空格。这分为Used: 0.44TB两个字段,Used0.44TB
  • ORS=" "设置输出将分隔符记录为空格。

awk代码只是打印每条记录的第二个字段,以 分隔ORS,并通过输出换行符结束。

如果你想从中删除所有非数字的内容,只需将其传递tr -dc '0-9. \n'

$ awk -vRS="   *|\n" -vFS=": ?" -vORS=" " '{ print $2 } END { printf("\n") }' data.in | tr -dc '0-9. \n'
44.75 0.44 42.04 6.07

tr -dc '0-9. \n'将删除除数字、点、空格或换行符之外的所有内容。

相关内容