A more powerful version of grep
The utility command grep has a more powerful brother that let us use POSIX Extended Regular Expressions.
The utility grep is extremely useful when we want to find something specific in files, manuals or in combination with ls to find files and directories. It's possible to do some simple searches with grep, here are two examples.
Find the database settings in a WordPress installation.
$ grep DB_ wp-config.php
define('DB_NAME', 'database');
define('DB_USER', 'username');
define('DB_PASSWORD', 'password');
define('DB_HOST', 'hostname');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');Find all the .log files in the current directory.
$ ls -l | grep .log$
-rw-r----- 1 syslog adm Jan 31 21:55 auth.log
-rw-r----- 1 syslog adm Jan 31 21:55 mail.log
-rw-r----- 1 mysql adm Jan 31 21:55 mysql.log
But how can we use more powerful regexp expressions. In the same way? No. Or Yes.
To use POSIX Extended Regular Expressions we need to add an option flag to grep, namely -E. Alternatively we can use the egrep command, which is a bit smoother. Initially I had no idea that egrep existed. I was tearing my hair out every time, until I found it.
A practical example
Let's say we have a directory with some files for a simple website.
$ ls -l
-rw-r--r-- 1 jdoe jdoe Jan 31 21:55 about.html
-rw-r--r-- 1 jdoe jdoe Jan 31 21:55 app.js
-rw-r--r-- 1 jdoe jdoe Jan 31 21:55 contact.html
-rw-r--r-- 1 jdoe jdoe Jan 31 21:55 data.json
-rw-r--r-- 1 jdoe jdoe Jan 31 21:55 index.html
-rw-r--r-- 1 jdoe jdoe Jan 31 21:55 logo.png
-rw-r--r-- 1 jdoe jdoe Jan 31 21:55 style.cssNow we want to list all files that end with .html or .js. This is how to do it.
$ ls -l | egrep "\.(html|js)$"
-rw-r--r-- 1 jdoe jdoe Jan 31 21:55 about.html
-rw-r--r-- 1 jdoe jdoe Jan 31 21:55 app.js
-rw-r--r-- 1 jdoe jdoe Jan 31 21:55 contact.html
-rw-r--r-- 1 jdoe jdoe Jan 31 21:55 index.html