我有一个如下的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中测试(