只从linux shell中提取数字



我有一个如下的curl输出,我只需要grep该输出中的数字。

卷曲输出

<h1>JVM</h1><p>Free Memory:2144.78 MB Total Memory:3072.00 MB Max Memory:3072.00 MB</p><table border="0">

Grep命令

grep -o -i 'Max Memory:.*'  | awk  '{ print $3 }'

输出

MB</p><table

预期产量:3072.00

空闲内存和总内存也是如此。

请帮助

第一个解决方案: 使用您显示的示例,请在GNUgrep中尝试以下操作。

grep -oP 'Total Memory:KS+' Input_file

如果您想匹配内存值的精确数字,请尝试以下操作:

grep -oP 'Total Memory:Kd+(?:.d+)?(?=s)' Input_file

解释:简单的解释是,首先使用GNUgrep-o-P选项。只打印匹配的文本并启用PCRE正则表达式风格。然后在主grep程序中,使用正则表达式匹配要搜索的Total Memory:,然后是K,这意味着如果找到了以前的匹配,则忘记匹配。那么匹配S+意味着在空间到来之前匹配所有非空间,这将捕获Total内存的值。



第二个解决方案:如果您想在输出中获得3个值以获得可用内存,请尝试以下awk代码。用GNUawk编写和测试。

awk -v RS='(Free Memory:|Total Memory:|Max Memory:)[^[:space:]]+' 'RT{sub(/.*:/,"",RT);print RT}' Input_file

注意:如果输出不在Input_file中,则可以使用管道连接到上一个命令,然后运行此命令。

下面是另一个gnu grep命令,用于在一个命令中获取所有内存编号:

s='<h1>JVM</h1><p>Free Memory:2144.78 MB Total Memory:3072.00 MB Max Memory:3072.00 MB</p><table border="0">'
grep -oP 'w+ Memory:K[d.]+' <<< "$s"
2144.78
3072.00
3072.00

您还可以使用sed从字符串中提取所有必要的详细信息:

fm=$(sed -n 's/.*Free Memory:([^ ]*).*/1/p' file)
tm=$(sed -n 's/.*Total Memory:([^ ]*).*/1/p' file)
mm=$(sed -n 's/.*Max Memory:([^ ]*).*/1/p' file)

查看在线演示:

#!/bin/bash
s='<h1>JVM</h1><p>Free Memory:2144.78 MB Total Memory:3072.00 MB Max Memory:3072.00 MB</p><table border="0">'
fm=$(sed -n 's/.*Free Memory:([^ ]*).*/1/p' <<< "$s")
tm=$(sed -n 's/.*Total Memory:([^ ]*).*/1/p' <<< "$s")
mm=$(sed -n 's/.*Max Memory:([^ ]*).*/1/p' <<< "$s")
echo "fm=$fm, tm=$tm, mm=$mm"
# => fm=2144.78, tm=3072.00, mm=3072.00

详细信息

  • -n抑制默认行输出
  • .*Free Memory:([^ ]*).*-匹配包含
    • .*-任意零个或多个字符
    • Free Memory:-固定字符串
    • ([^ ]*)-组1(1(:任意零个或多个非空格字符
    • .*-任意零个或多个字符
  • /1/-替换与组1值匹配的行
  • p-打印成功替换的结果

试试这个:

grep -o -i 'Max Memory:.*'  | cut -d ':' -f 2 |awk  '{ print $1 }'

我会按照下面的方式为这个任务GNUAWK,让file.txt的内容是

<h1>JVM</h1><p>Free Memory:2144.78 MB Total Memory:3072.00 MB Max Memory:3072.00 MB</p><table border="0">

然后

awk 'BEGIN{FPAT="[0-9]+[.][0-9]+"}{print $1,$2,$3}' file.txt

输出

2144.78 3072.00 3072.00

解释:我通知GNUAWK,字段是一个或多个数字,后面跟着文字.,后面跟着一个或更多数字。Iprint第1、2、3字段免责声明:我想你只对里面有单个.的数字感兴趣。注意,未检测到<table border="0">中的0。随时根据您的需要进行调整。

(在gawk 4.2.1中测试(

相关内容

  • 没有找到相关文章

最新更新