仅搜索 linux shell 中的数字

Grep only the numbers from 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  }'

输出

MB</p><table

预期输出:3072.00

同样适用于可用内存和总内存。

请帮忙

第一个解决方案: 使用您显示的示例,请尝试在 GNU grep.

中执行以下操作
grep -oP 'Total Memory:\K\S+' Input_file

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

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

解释: 简单的解释就是,使用 GNU grep-o-P选项首先。仅打印匹配的文本并启用 PCRE 正则表达式风格。然后在主 grep 程序中使用正则表达式匹配 Total Memory: 进行搜索,然后是 \K ,这意味着如果找到之前的匹配则忘记匹配。然后匹配 \S+ 意味着在 space 出现之前匹配所有 non-space(s),这将捕获总内存的值。



第二个解决方案: 如果您想在输出中获得 3 个值以获得可用内存、最大值和总值,请尝试以下 awk代码。在 GNU awk.

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

注意: 如果您的输出不在 Input_file 中,那么您可以使用管道连接到您之前的命令并且然后运行这个。

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

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

online demo:

#!/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:\([^ ]*\).*//p' <<< "$s")
tm=$(sed -n 's/.*Total Memory:\([^ ]*\).*//p' <<< "$s")
mm=$(sed -n 's/.*Max Memory:\([^ ]*\).*//p' <<< "$s")
echo "fm=$fm, tm=$tm, mm=$mm"
# => fm=2144.78, tm=3072.00, mm=3072.00

详情:

  • -n 抑制默认行输出
  • .*Free Memory:\([^ ]*\).* - 匹配包含的整行
    • .* - 任意零个或多个字符
    • Free Memory: - 固定字符串
    • \([^ ]*\) - 第 1 组 (</code>):任意零个或多个 non-space 个字符</li> <li><code>.* - 任意零个或多个字符
  • // - 替换与组 1 值匹配的行
  • p - 打印成功替换的结果。

试试这个:

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

我将 GNU AWK 按照以下方式完成此任务,令 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 ,,}' file.txt

输出

2144.78 3072.00 3072.00

说明:我通知 GNU AWK 该字段是 1 位或多位数字后跟文字 . 后跟 1 位或多位数字。我print第一场,第二场,第三场。 免责声明:我假设您只对内部有单个 . 的数字感兴趣。请注意,未检测到 <table border="0"> 中的 0。随时根据您的需要进行调整。

(在 gawk 4.2.1 中测试)

这是另一个 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