Ripgrep is faster (2016)
blog.burntsushi.net
blog.burntsushi.net
I've looked into it before, but it looks like a fairly weighty process to go through.
It does look like someone is working on it though! https://github.com/x4121/ripgrep-ubuntu
ripgrep's releases do include binary debs, but there's no auto-update:
$ curl -LO https://github.com/BurntSushi/ripgrep/releases/download/0.10.0/ripgrep_0.10.0_amd64.deb
$ sudo dpkg -i ripgrep_0.10.0_amd64.deb #!/bin/sh
curvers=
if command -V rg > /dev/null 2>&1; then
curvers="$(rg -V | cut -d' ' -f2)"
fi
latesturl="https://api.github.com/repos/BurntSushi/ripgrep/releases/latest"
latestvers="$(curl -s "$latesturl" | jq -r .tag_name)"
if [ "$curvers" = "$latestvers" ]; then
echo "ripgrep is up to date"
exit 0
fi
name="ripgrep_${latestvers}_amd64.deb"
url="https://github.com/BurntSushi/ripgrep/releases/download/$latestvers/$name"
(cd /tmp && curl -LO "$url" && sudo dpkg -i "$name")
echo "ripgrep updated from $curvers to $latestvers"Other locations like `/usr/local` or `/opt/linuxbrew` or somesuch might not be writable by the current user, and it seems they would like to avoid requiring root access.
Using /home/ like /opt/ is just weird. It seems the installer picks ~/.linuxbrew/ if the user doesn't have sudo privilege but no idea how it got to the conclusion of using /home/linuxbrew/ otherwise.
It might even be installable on older versions of Ubuntu.
I doubt it's a coincidence. There's a common pattern where a popular new topic/thing on HN generates a few reposts and posts of old articles about the popular new topic/thing.
Also note that if you still have UUCP infrastructure, the name "cu" will collide with an already installed program.
In some simple tests on my Linux checkout, it is about an order of magnitude slower than ripgrep though. It looks like a good chunk of time is spent in gitignore filtering?
I don't think it has multi-line search, which is something I've learned that ag users happen to love, which is why it's in the most recent release of ripgrep. :-)
Ripgrep does have some neat advanced features though...
yes, that's the primary reason for me :)
alias g="git grep"That's why I've switched to using it pretty exclusively now.
$ git clone --depth 1 https://github.com/BurntSushi/linux
$ cd linux
$ time LC_ALL=en_US.UTF-8 git grep -E '\w+_RESUME' | wc -l
1998
real 20.616
user 2:02.49
sys 0.363
maxmem 64 MB
$ time rg '\w+_RESUME' | wc -l
1998
real 0.127
user 0.673
sys 0.617
maxmem 26 MB
Both of these invocations are doing roughly equivalent work, including
respecting gitignores. Both of them are using a Unicode aware `\w` character
class. OK, so you might say you don't care about Unicode. That's fine, ripgrep
is still faster by an order of magnitude: $ time LC_ALL=C git grep -E '\w+_RESUME' | wc -l
1998
real 4.546
user 27.741
sys 0.420
maxmem 63 MB
With that said, `git grep` can now be made to use PCRE2, which gives it a
significant speed boost on this workload: $ time LC_ALL=en_US.UTF-8 git grep -P '(*UCP)\w+_RESUME' | wc -l
1998
real 0.894
user 5.821
sys 0.493
maxmem 63 MB
$ time LC_ALL=C git grep -P '\w+_RESUME' | wc -l
1998
real 0.517
user 2.962
sys 0.596
maxmem 59 MB
ripgrep can do the same as of this release, but faster: $ time rg -P '\w+_RESUME' | wc -l
1998
real 0.511
user 4.795
sys 0.544
maxmem 24 MB
$ time rg -P --no-pcre2-unicode '\w+_RESUME' | wc -l
1998
real 0.422
user 4.119
sys 0.479
maxmem 24 MB
Do these performance differences matter to you? Maybe not. But you said you
couldn't understand; hopefully the numbers above add some clarity. :-) On top
of that, ripgrep works just as well outside of git repos, on huge log files,
binary data or even in shell pipelines.Another approach I've seen people take is to put `-M300` in your ripgrep config file, and then any super long lines are automatically omitted from output.
I consider .grepignore to be more comprehensible.