我有一些大文件已更改为“标准化形式”,删除了换行符。我想加快这些文件的 grep 速度。我知道您可以通过执行以下操作来优化 grep grep 'partofpattern' | grep -E 'partofpattern [[:digit:]]+'
- 也就是说,让 grep 搜索包含模式的更简单部分的行,然后让 grep 在包含模式部分的几行上第二次运行。这让我觉得 grep 是以某种方式逐行工作的。那么在没有换行符的大文件中添加换行符会加快 grep 的速度吗?
答案1
您可能应该只使用fmt
or fold
or pr
or 其中之一。这是fmt
:
until [ $((i=i+1)) -gt 10000 ]
do printf %s\ words and more words
done | fmt
输出
words and more words words and more words words and more words words
and more words words and more words words and more words words and more
words words and more words words and more words words and more words
words and more words words and more words words and more words words
and more words words and more words words and more words words and more
#...and so on for a long time
grep
的缓冲区必然会在任何严重负载下让路,除非它可以将其转储到换行符边界。
例如:
time (
tr \\0 \\n < /dev/zero |
sed 'c words and words and words and words and words and' |
tr -d \\n |
grep -o words
)
grep: memory exhausted
49.42s user 44.93s system 229% cpu 41.070 total
这需要一段时间 - 但该系统上有大量空 RAM,并且仍然设法在一分钟内崩溃。
所以就:
fmt <file | grep search
不过,如果文件中有一些可靠的单字符串分隔符,则更可靠:
tr ${delim} \\n <file | grep search
答案2
grep 绝对可以基于行工作,sed 也是如此。它不一定会加快搜索速度,但生成匹配行的输出应该会更快。