我们试图仅从下面的输出中获取数据,我们尝试使用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.75TB
和Used: 0.44TB
。FS=": ?"
将字段分隔符设置为冒号,可以选择后跟一个空格。这分为Used: 0.44TB
两个字段,Used
和0.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'
将删除除数字、点、空格或换行符之外的所有内容。