ack-grep – A grep-like program specifically for large source trees
Ack also ignores backup files and files under .cvs and .svn directories.
Install ack-grep in Ubuntu
sudo apt-get install ack-grep
Usage: ack [OPTION]... PATTERN [FILE]
Search for PATTERN in each source file in the tree from cwd on down.If [FILES] is specified, then only those files/directories are checked.ack may also search STDIN, but only if no FILE are specified, or if one of FILES is "-".
Default switches may be specified in ACK_OPTIONS environment variable or an .ackrc file. If you want no dependency on the environment, turn it off with
Example: ack -i select
--ignore-case Ignore case distinctions in PATTERN
--[no]smart-case Ignore case distinctions in PATTERN,only if PATTERN contains no upper caseIgnored if -i is specified
--invert-match Invert match: select non-matching lines
--word-regexp Force PATTERN to match only whole words
--literal Quote all metacharacters; PATTERN is literal
--line=NUM Only print line(s) NUM of each file
-- files-with-matches Only print filenames containing matches
--files-without-match Only print filenames with no match
-o Show only the part of a line matching PATTERN (turns off text highlighting)
--passthru Print all lines, whether matching or not
--output=expr Output the evaluation of expr for each line (turns off text highlighting)
--match PATTERN Specify PATTERN explicitly.
--max-count=NUM Stop searching in each file after NUM matches
-1 Stop searching after one match of any kind
--with-filename Print the filename for each match
--no-filename Suppress the prefixing filename on output
--count Show number of lines matching per file
--after-context=NUM Print NUM lines of trailing context after matching lines.
--before-context=NUM Print NUM lines of leading context before matching lines.
--context[=NUM] Print NUM lines (default 2) of output context.
--print0 Print null byte as separator between filenames,only works with -f, -g, -l, -L or -c.
--pager=COMMAND Pipes all ack output through COMMAND.Ignored if output is redirected.
--nopager Do not send output through a pager. Cancels any setting in ~/.ackrc, ACK_PAGER or ACK_PAGER_COLOR.
--[no]heading Print a filename heading above each file's results.(default: on when used interactively)
--[no]break Print a break between results from different files.(default: on when used interactively)
--group Same as
--nogroup Same as
--[no]color Highlight the matching text (default: on unless output is redirected, or on Windows)
--[no]colour Same as
--flush Flush output immediately, even when ack is used non-interactively (when output goes to a pipe or file).
-f Only print the files found, without searching.The PATTERN must not be specified.
-g REGEX Same as -f, but only print files matching REGEX.
--sort-files Sort the found files lexically.
--all-types All file types searched;Ignores CVS, .svn and other ignored directories
--unrestricted All files and directories searched
--[no]ignore-dir=name Add/Remove directory from the list of ignored dirs
-n No descending into subdirectories
-G REGEX Only search files that match REGEX
--perl Include only Perl files.
--type=perl Include only Perl files.
--noperl Exclude Perl files.
--type=noperl Exclude Perl files.
--help type" for supported filetypes.
--type-set TYPE=.EXTENSION[,.EXT2[,...]] Files with the given EXTENSION(s) are recognized as being of type TYPE. This replaces an existing definition for type TYPE.
--type-add TYPE=.EXTENSION[,.EXT2[,...]] Files with the given EXTENSION(s) are recognized as being of (the existing) type TYPE
--[no]follow Follow symlinks. Default is off.
Directories ignored by default:
autom4te.cache, blib, _build, .bzr, .cdv, cover_db, CVS, _darcs, ~.dep,
~.dot, .git, .hg, ~.nib, .pc, ~.plst, RCS, SCCS, _sgbak and .svn
Files not checked for type:
/~$/ -- Unix backup files
/#.+#$/ -- Emacs swap files
/[._].*\.swp$/ -- Vi(m) swap files
/core\.\d+$/ -- core dumps
Thanks for sharing
@rungss on Twitter
What’s the difference with “find FIND_OPTIONS -print0 | xargs -0 grep GREP_OPTIONS” ?
Greg, the normal find | xargs grep pipe doesn’t have the smarts of ack-grep, it will look through version control files, object files, etc. Sometimes that’s what you want, but if you’re just looking for the place in the big source tree that a particular message is emitted, ack-grep is going to be closer to what you need.
What I can’t figure out is if there is a combination of options that will get the “normal” grep -n output of ::. I’d like that so I could use the emacs “M-x grep” command to get the hits in a buffer and walk through them with “C-x `”.
I guess I could use “ack-grep -l $PATTERN | xargs grep -n /dev/null $PATTERN” but that seems wasteful.
Eek, got blindsided by unexpected html-ish processing. above should read
… “normal” grep -n output of <.filename>.:<.linenumber>.:&ln.line contents&.gt.
you should use code tags or fixed width font for usage detail, it’s quite unreadable in current state. It’s a pity as this command seems very useful (nice find !!)
Thanks for your comment and i have updated article with good format
you should really consider fixed width font (or suppress “ack-grep –help” output to replace it with examples), because variable width font destroys all the beautiful lined up comments about each option 🙂