Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使GREP只选择数值?_Linux_Bash_Grep - Fatal编程技术网

Linux 如何使GREP只选择数值?

Linux 如何使GREP只选择数值?,linux,bash,grep,Linux,Bash,Grep,我在bash脚本中使用df命令: df . -B MB | tail -1 | awk {'print $4'} | grep .[0-9]* 此脚本返回: 99% 99 但我只需要数字(进行下一次比较)。 如果我使用不带点的grepregex: df . -B MB | tail -1 | awk {'print $4'} | grep .[0-9]* 我什么也没收到。 如何修复?如果您尝试: echo "99%" |grep -o '[0-9]*' 它返回: 99% 99

我在bash脚本中使用
df
命令:

df . -B MB | tail -1 | awk {'print $4'} | grep  .[0-9]*
此脚本返回:

99%
99
但我只需要数字(进行下一次比较)。 如果我使用不带点的
grep
regex:

df . -B MB | tail -1 | awk {'print $4'} | grep  .[0-9]*
我什么也没收到。 如何修复?

如果您尝试:

 echo "99%" |grep -o '[0-9]*'
它返回:

99%
99

以下是有关的
-o
(或
--仅匹配的
标志)工作原理的详细信息

仅打印匹配行中匹配的(非空)部分,每个部分都在单独的输出行上。输出行使用与输入相同的分隔符,如果还使用-z(--null data),则分隔符为空字节(请参阅)


grep
将打印与您提供的图案匹配的任何行。如果只想打印与图案匹配的线条部分,可以传递-o选项:

-o,--仅匹配 仅打印匹配行中匹配的(非空)部分,每个部分在单独的输出行上

像这样:

echo 'Here is a line mentioning 99% somewhere' | grep -o '[0-9]+'
那么:

df . -B MB | tail -1 | awk {'print $4'} | cut -d'%' -f1

无需在此处使用grep,请尝试以下操作:

df . -B MB | tail -1 | awk {'print substr($5, 1, length($5)-1)'}

不要使用过多的命令,不要使用tail、grep和cut。你只需要(一个简单的)awk就可以做到这一点

附言:只提供印刷版大小的字体有点傻;-)因此,也要去掉“-B MB”

df|awk-F'[多个字段分隔符]''$NF==“最后一个字段必须精确-->装入的分区“{print$(NF-最后一个字段的编号)}”

在您的情况下,请使用:

df . |awk -F'[ %]' '$NF=="/" {print $(NF-2)}'
输出:81

如果要显示百分比符号,可以将-F“[%]”保留,打印字段将再向后移动1个字段

df . |awk '$NF=="/" {print $(NF-1)}'

输出:81%您也可以使用Perl风格的正则表达式。那么一个数字就是
\d

grep -Po "\\d+" filename
-p将模式解释为与Perl兼容的正则表达式(PCRE)


-o只打印匹配行中匹配的(非空)部分,每个部分在单独的输出行上。

您也可以使用别名
\d
echo“99%”grep-o'\d*
您确定@FabSa吗?你做过测试吗?AFAK,grep default use BRE..它对我有效是的(在OsX上),但也许你需要gnu grep的“扩展regexp”(带有
-E
)@FabSa,为了使
\d
有效,你需要
-P
。如果有一个可移植的版本可用,使用可移植的。这不会在所有版本/构建的grep上工作。你需要-P或-E,所以这将起作用echo“这里是一行,某处提到99%”grep-oP“[0-9]+”或echo“这里是一行,某处提到99%”grep-oP“[0-9]+”