我有一个具有这种格式的文件
[ 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
.以下是一些其他方法:
sed
sed -r 's/.* ([0-9]+\.*[0-9]*).*?/\1/' logfile.txt > outfile.txt
需要
-r
使用 以避免必须转义括号。perl
perl -pe 's/.* (\d+\.*\d*).*/$1/' logfile.txt > outfile.txt
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