我正在尝试使用grep匹配所有数字,包括整数和十进制,并在同一行上打印匹配项(以便更轻松地使用gnuplot进行绘制)。例如,
echo "bench-100-net-buffering1000.out:Throughput: 3212.97" | grep -E -o '\d+(\.\d+)?'
版画
100
1000
3212.97
但是如何在同一行中将所有内容如下所示?
100 1000 3212.97
编者注:问题的原始形式\d+
与正则表达式一样使用,反映在一些较早的答案中。
最终,我希望它可以使用多个输入文件,如下所示:
grep Throughput *.out | grep -E -o '\d+(\.\d+)?'
应该打印
100 1000 3212.97
200 3000 5444.77
300 5000 6769.32
其他一些变体:
下面的每个示例都使用此正则表达式:
(\d+\.\d*|\.\d+|\d+)
它与一组匹配ddd.
ddd.ddd
.ddd
ddd
。如果您的小数位不同,例如不想捕获.ddd
(仅十进制)变体,只需将其从正则表达式中删除即可。
一个文件/字符串的用法
#using `paste`
echo "bench-100-net-buffering1000.out:Throughput: 3212.97" | grep -Eo '(\d+\.\d*|\.\d+|\d+)' | paste -s -
# using echo for making the "one line"
echo $(grep -Eo '(\d+\.\d*|\.\d+|\d+)' <<< "bench-100-net-buffering1000.out:Throughput: 3212.97")
#HERESTRING and different separator
grep -Eo '(\d+\.\d*|\.\d+|\d+)' <<< "bench-100-net-buffering1000.out:Throughput: 3212.97" | paste -sd, -
#process substitution.. ;)
paste -sd ' ' <(grep -Eo '(\d+\.\d*|\.\d+|\d+)' <<< "bench-100-net-buffering1000.out:Throughput: 3212.97")
与上面的多个文件相同,使用bash
循环。在示例中ff*
用于文件名。
#Using null-term find
while IFS= read -r -d '' file; do
grep -Eo '(\d+\.\d*|\.\d+|\d+)' "$file" | paste -s -
done < <(find . -maxdepth 1 -type f -name ff\* -print0)
# or alternative - also prints filenames
while IFS= read -r -d '' file; do
echo "$file:" $(grep -Eo '(\d+\.\d*|\.\d+|\d+)' $file)
done < <(find . -maxdepth 1 -type f -name ff\* -print0)
echo Using FOR loop
for file in ff* ; do
grep -Eo '(\d+\.\d*|\.\d+|\d+)' "$file" | paste -s -
done
perl变体:
perl -0777 -nE 'say "@{[/(\d+\.\d*|\.\d+|\d+)/g]}"' ff*
还打印文件名
perl -0777 -nE 'say "$ARGV @{[/(\d+\.\d*|\.\d+|\d+)/g]}"' ff*
也可以通过使用不同的字段分隔符 \t
perl -0777 -nE '$"="\t";say "$ARGV @{[/(\d+\.\d*|\.\d+|\d+)/g]}"' ff*
所有perl
解决方案都使用婴儿车操作员。通常不建议将其用于生产代码,但对于单行代码是可接受的。
演示:
perl -0777 -nE 'say "@{[/(\d+\.\d*|\.\d+|\d+)/g]}"' <<< "some-111-decimal-222.-another-333.33-only-frac-.444.txt"
输出
111 222. 333.33 .444
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句