如何使用 sed 或任何其他工具提取文件中的数字?

如何使用 sed 或任何其他工具提取文件中的数字?

我有一个具有这种格式的文件

[ 2014/05/01 10:48:26 | 13963 | DEBUG ] 完成该过程花费了 11.16837501525879 秒

所以我有数千行这样的行,我想“提取”我尝试过的11.16837501525879部分

 sed -e 's/^.* (\d+\.\d*)/\1/g' logfile.txt > out.txt  

但我得到:

sed: -e expression #1, char 21: invalid reference \1 on `s' command's RHS  

我在这里能做什么?

答案1

sed默认情况下使用基本正则表达式,而 BRE 不知道\d.以下是一些其他方法:

  1. sed

    sed -r 's/.* ([0-9]+\.*[0-9]*).*?/\1/' logfile.txt > outfile.txt
    

    需要-r使用 以避免必须转义括号。

  2. perl

    perl -pe 's/.* (\d+\.*\d*).*/$1/' logfile.txt > outfile.txt
    
  3. grep

    grep -Po '.* \K\d+\.*\d*' logfile.txt > outfile.txt
    

这些都使用您的基本方法,即填充 find全部行中前面有空格的数字组。根据行上可以出现多少组数字,如果您的输入行始终采用您显示的格式,则更安全的方法是:

grep -Po 'took \K\d+\.*\d*' logfile.txt 

答案2

sed 中分组括号必须加反斜杠。另外,sed 不支持\d.此外,您还应该删除这些词号码:

sed -e 's/^.* \([0-9]\+\.[0-9]*\) .*/\1/g'

顺便说一句,您确定点总是存在,但小数是可选的吗?12.似乎不是预期值。

答案3

您可以使用 awk 打印第 11 列(由空格分隔决定)。

awk '{ print $11 }' logfile.txt > output

相关内容