Linux 如何使GREP只选择数值?
我在bash脚本中使用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
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]+”