Command Line Search Tools for Programmers
Over the last several years, I’ve improved my command line searches through a few tools geared towards programmers. These tools help developers find phrases and patterns in text files in an unfamiliar codebase without the complexity of grep.
Searching for a unique string or keyword is an excellent way to find out where functionality is located without jumping into a text editor. Another use I have is finding previous commands that you ran via history and using a tool like grep to filter down lines that match a given pattern.
The following is a list of five command line search tools that will help you as a developer if you are interested in using the command line more for finding code, text, and files quickly without relying on an editor or an IDE.
Some of the tools are ‘nix only, but I’ve listed a few that are cross-platform and ridiculously fast!
Grep
The nice benefit of using grep is that it’s available on pretty much any ‘nix distribution you might use. Its utility is powerful in many different contexts, and I’ll show you a few of my favorite:
If you want to find a phrase in only PHP files and output the line number:
$ grep -RHn --include \*.php Controller .
Let’s say you typed a command into the console a few days ago but you only recall part of the command. You can pipe (|) the history command to search with grep:
$ history | grep "php artisan"
You can pipe all of CLI tools listed in this article, but I find I just need a simple grep which filtering history. A nice side-effect is that the filtered results will give you a number at the beginning and you can use it to re-run the command:
$ history | grep 'php artisan'284 php artisan route:list $ !284$ php artisan route:list
Ack
Ack is “a tool like grep, optimized for programmers.” It searches recursively by default (i.e., your project) while ignoring VCS directories like .git and has convenient tools that help you explore code with fewer keystrokes.
Taking the same grep example, here’s how we would search for “Controller” in only PHP files:
# Ack$ ack Controller --php # Here's the grep example$ grep -RHn --include \*.php Controller .
Let’s say that you wanted to search all other types of files except PHP. Each type has a “no” flag:
You can extend ack through an ~/.ackrc file to add custom types like —php . Let’s say that you commonly search in only blade files with something like this:
$ ack @auth --bladeUnknown option: bladeack: Invalid option on command line
To register the “blade” type, you can add the following to an ~/.ackrc file and then search above will only look in files that end in blade.php :
--type-set=blade:match:.blade.php$
Here are a few other options you might want as a Laravel developer in the ~/.ackrc file:
# Always use color--color # Ignore PhpStorm and NPM--ignore-dir=.idea/--ignore-dir=node_modules/ # Add to existing types--type-add=ruby:ext:haml,rake,rsel # Add new types--type-set=smarty:ext:tpl--type-set=cakeview:ext:ctp,thtml--type-set=markdown:ext:md,markdown--type-set=json:ext:json--type-set=blade:match:.blade.php$
Ack looks in various locations for an .ackrc file, but if you want to run ack without any .ackrc file, use the —noenv flag.
You can verify your custom types by running ack —help-types . Ack has a ton of documentation and probably does things I haven’t discovered yet. Check man ack for more information or check ack manual online.
The Silver Searcher
The Silver Searcher is another grep replacement that is similar to ack, but touts faster performance. It ignores files found in a project’s .gitignore file.
You can install Silver Searcher with Homebrew on OS X:
brew install the_silver_searcher
You run The Silver Searcher with the ag command:
I won’t cover ag in a ton of detail, but if I want to search a lot of files I sometimes reach for ag .
Sift
Sift is a grep alternative built with Golang which means that it’s widely available on Linux, Windows, OS X, and others. It’s ridiculously fast, and it has some cool use-cases that replace grep + awk combinations to extract data.
I suggest that you check out the samples to learn about the powerful features in sift.
Using our basic PHP search we’ve used for the other tools, here’s how you’d find “Controller” in PHP files:
# Only PHPsift --ext php Controller # Exclude PHPsift --exclude-ext php Controller
RipGrep
RipGrep aligns itself as similar to The Silver Searcher, but with “the raw speed of GNU grep,” and it works on Mac, Linux, and Windows. The readme claims that RipGrep is generally faster than anything else, touting Rust’s regular expression engine, and honors the .gitignore file like The Silver Searcher.
Here’s how you would search PHP files for “Controller” with RipGrep:
What’s Next?
Ack is my trusty search tool of choice and I think you will get a lot of value in using it as a grep replacement. I would highly recommend learning how to use ack first, but these tools all have unique features that make them valuable in different ways.
If you need to search large amounts of files (I am looking at you recursive node_modules/ folder) then go for The Silver Searcher, Sift, or RipGrep. In large projects ack is still a decently performant tool but you will notice speed improvements in the other tools.
Full stack web developer. Author of Lumen Programming Guide and Docker for PHP Developers.
Php linux grep all php files
EDIT: The expected output is PHP source code, even if it spans multiple lines. The sample output is bad, as it contains HTML in between: EDIT 2: The answer given by @SigmaPiEpsilon works, but grep doesn’t print code that spans multiple lines.
Grepping only source code from PHP file
Is there any clean grep one-liner to grep only the PHP source (the code between ) from a PHP file? Thus far I’ve tried:
grep -oiE "" name_of_php_file
But it seems to return muddled entries like:
Expecting a one-liner which would return only PHP source, without any muddled entries. sed and awk are OK.
Find list of PHP files without a namespace
I’m trying to find a list of PHP files in a directory that do not include a namespace. That can be derived in the codebase I’m working in by finding files that open a PHP tag, then immediately declare a class like so:
This doesn’t give me any results. What command will find the results I want?
grep scans each line individually, so unfortunately your \s won’t allow it to match several lines together. I’d recommend simply searching for PHP files which don’t include namespace declarations.
grep -vl «^namespace » $(grep -lr «<\?php")
Thanks to Wiktor in the comments.
did the job. The flag z makes the difference; it tells grep to read data until it finds a null byte rather than a newline, so an entire file can be searched for a match rather than one line.
How to find file with name=»php.ini» on linux using grep command, To search within the current directory, use find . -name php.ini . To ignore case, use find . -iname php.ini . To search for directory names, use
Grep $_SESSION[‘id’] only in php files
Trying to grep $_SESSION[‘id’] only in PHP files
grep -r --include="*.php" "SESSION\['id'\]" /var/www/ > grep.txt
But I got something terrible in grep.txt and not only matches.
How to write right syntax?
Wish I could find the guy who gave GNU grep options to search for files to ask why and who told him it was a reasonable thing to do!
Anyway. the UNIX tool to find files is named find :
find /var/www -name '*.php' | xargs grep -F "\$_SESSION['id']"
The problem is that $_ is being interpreted within double quotes: grep «$var» is looking for the content of $var , whereas grep ‘$var’ is looking for the literal string $var .
So you need to use single quotes to avoid this. Since your pattern already contains single quotes, we have to close and open again:
grep -r --include="*.php" '$_SESSION['"'"'id'"'"']' /var/www/ > grep.txt
I use a command-line tool called ‘ack-grep’. By default, it only searches ‘source code’, but you can also narrow things down to specific file extensions (like —php which matches «.php .phpt .php3 .php4 .php5 .phtml», and the #! line with ‘php’ in it).
You can also set it to also ignore particular directories by default — I’ve set a local config to not go into the vendor/ directory.
The $ still has to be \quoted — though that’s because of the external double-quotes.
Find all .php files inside directories with 777 permissions, I have recently had a linux server compromised from bots uploading .php scripts and posing as images. I’m currently in the process of fixing