仅搜索 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)
#!/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
我有如下的 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)
#!/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