如何检索数字,包括分隔符“。”

时间:2014-03-25 05:21:33

标签: bash sed

我使用grep来获取这样的字符串:ANS_LENGTH=266.50然后我使用sed来获取数字:266.50

这是我的完整命令:grep --text 'ANS_LENGTH=' log.txt | sed -e 's/[^[[:digit:]]]*//g'

结果是:26650

如何更改此行,以便结果仍显示分隔符:266.50

3 个答案:

答案 0 :(得分:2)

如果您要使用grep,则不需要sed。只需使用sed' //来匹配您需要打印的行。

sed -n '/ANS_LENGTH/s/[^=]*=\(.*\)/\1/p' log.txt
  • -n将禁止打印与/ANS_LENGTH/
  • 不匹配的行
  • 使用捕获的组,我们打印=符号旁边的值。
  • 最后的
  • p标记允许打印与//匹配的行。

如果您的grep恰好支持-P选项,则可以执行以下操作:

grep -oP '(?<=ANS_LENGTH=).*' log.txt
  • (?<=...)是一个后视构造,允许我们匹配您需要的线条。这需要-P选项
  • -o允许我们只打印值部分。

答案 1 :(得分:1)

您需要匹配文字点和数字。

尝试sed -e 's/[^[[:digit:]\.]]*//g'

点将匹配任何单个字符。使用反斜杠转义它只会匹配一个文字点。

答案 2 :(得分:0)

以下是一些awk示例:

cat file:
some data ANS_LENGTH=266.50 other=22
not mye data=43

gnu awk(由于RS)

awk '/ANS_LENGTH/ {f=NR} f&&NR-1==f' RS="[ =]" file
266.50

awk '/ANS_LENGTH/ {getline;print}' RS="[ =]" file
266.50

普通awk

awk -F"[ =]" '{for(i=1;i<=NF;i++) if ($i=="ANS_LENGTH") print $(i+1)}' file
266.50

awk '{for(i=1;i<=NF;i++) if ($i~"ANS_LENGTH") {split($i,a,"=");print a[2]}}' file
266.50