http://www.cyberciti.biz/faq/grep-regular-expressions/

H</span>ow do I use the Grep command with regular expressions on a Linux and Unix-like operating systems?
</span>
Linux comes with GNU grep, which supports extended regular expressions. GNU grep is the default on all Linux systems. The grep command</a> is used to locate information stored anywhere on your server or workstation.

Regular Expressions</h2>

Tutorial details</th>

</th>
</tr>

Difficulty</td>

Easy</a> (rss</a>)</td>
</tr>

Root privileges</td>

No</td>
</tr>

Requirements</td>

None</td>
</tr>

Estimated completion time</td>

10m</td>
</tr>
</tbody>
</table>
</div>
Regular Expressions is nothing but a pattern to match for each input line. A pattern is a sequence of characters. Following all are examples of pattern:
^w1
w1|w2
[^ ]</kbd>

grep Regular Expressions Examples</h3>
Search for 'vivek' in /etc/passswd
grep vivek /etc/passwd</code>
Sample outputs:

vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh
gitevivek:x:1002:1002::/home/gitevivek:/bin/sh</pre>
Search vivek in any case (i.e. case insensitive search)
grep -i -w vivek /etc/passwd</code>
Search vivek or raj in any case
grep -E -i -w 'vivek|raj' /etc/passwd</code>
The PATTERN in last example, used as an extended regular expression.

Anchors</h2>
You can use ^ and $ to force a regex to match only at the start or end of a line, respectively. The following example displays lines starting with the vivek only:
grep ^vivek /etc/passwd</code>
Sample outputs:

vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh</pre>
You can display only lines starting with the word vivek only i.e. do not display vivekgite, vivekg etc:
grep -w ^vivek /etc/passwd</code>
Find lines ending with word foo:
grep 'foo$' filename</code>
Match line only containing foo:
grep '^foo$' filename</code>
You can search for blank lines with the following examples:
grep '^$' filename</code>

Character Class</h2>
Match Vivek or vivek:
grep '[vV]ivek' filename</code>
OR
grep '[vV][iI][Vv][Ee][kK]' filename</code>
You can also match digits (i.e match vivek1 or Vivek2 etc):
grep -w '[vV]ivek[0-9]' filename</code>
You can match two numeric digits (i.e. match foo11, foo12 etc):
grep 'foo[0-9][0-9]' filename</code>
You are not limited to digits, you can match at least one letter:
grep '[A-Za-z]' filename</code>
Display all the lines containing either a "w" or "n" character:
grep [wn] filename</code>
Within a bracket expression, the name of a character class enclosed in "[:" and ":]" stands for the list of all characters belonging to that class. Standard character class names are:

  • [:alnum:]</strong></kbd> - Alphanumeric characters.</li>
  • [:alpha:]</strong></kbd> - Alphabetic characters</li>
  • [:blank:]</strong></kbd> - Blank characters: space and tab.</li>
  • [:digit:]</strong></kbd> - Digits: '0 1 2 3 4 5 6 7 8 9'.</li>
  • [:lower:]</strong></kbd> - Lower-case letters: 'a b c d e f g h i j k l m n o p q r s t u v w x y z'.</li>
  • [:space:]</strong></kbd> - Space characters: tab, newline, vertical tab, form feed, carriage return, and space.</li>
  • [:upper:]</strong></kbd> - Upper-case letters: 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'.</li>
    </ul>
    In this example match all upper case letters:
    grep '[:upper:]' filename</code>

    Wildcards</h2>
    You can use the "." for a single character match. In this example match all 3 character word starting with "b" and ending in "t":

    grep '\' filename</pre>
    Where,

    • \< Match the empty string at the beginning of word</li>
    • \> Match the empty string at the end of word.</li>
      </ul>
      Print all lines with exactly two characters:
      grep '^..$' filename</code>
      Display any lines starting with a dot and digit:
      grep '^\.[0-9]' filename</code>

      Escaping the dot</h3>
      The following regex to find an IP address 192.168.1.254 will not work:
      grep '192.168.1.254' /etc/hosts</code>
      All three dots need to be escaped:
      grep '192\.168\.1\.254' /etc/hosts</code>
      The following example will only match an IP address:

      egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' filename</pre>
      The following will match word Linux or UNIX in any case:
      egrep -i '^(linux|unix)' filename</code>

      How Do I Search a Pattern Which Has a Leading - Symbol?</h2>
      Searches for all lines matching '--test--' using -e option Without -e, grep would attempt to parse '--test--' as a list of options:
      grep -e '--test--' filename</code>

      How Do I do OR with grep?</h2>
      Use the following syntax:
      grep 'word1|word2' filename</code>
      OR
      grep 'word1\|word2' filename</code>

      How Do I do AND with grep?</h2>
      Use the following syntax to display all lines that contain both 'word1' and 'word2'
      grep 'word1' filenae | grep 'word2'</code>

      How Do I Test Sequence?</h2>
      You can test how often a character must be repeated in sequence using the following syntax:

      {N}
      {N,}
      {min,max}</pre>
      Match a character "v" two times:
      egrep "v{2}" filename</code>
      The following will match both "col" and "cool":
      egrep 'co{1,2}l' filename</code>
      The following will match any row of at least three letters 'c'.
      egrep 'c{3,}' filename</code>
      The following example will match mobile number which is in the following format 91-1234567890 (i.e twodigit-tendigit)

      grep "[[:digit:]]\{2\}[ -]\?[[:digit:]]\{10\}" filename</pre>

      How Do I Hightlight with grep?</h2>
      Use the following syntax:
      grep --color regex filename</code>

      How Do I Show Only The Matches, Not The Lines?</h2>
      Use the following syntax:
      grep -o regex filename</code>

      Regular Expression Operator</h2>

      Regex operator</th>

      Meaning</th>
      </tr>

      .</td>

      Matches any single character.</td>
      </tr>

      ?</td>

      The preceding item is optional and will be matched, at most, once.</td>
      </tr>

      *</td>

      The preceding item will be matched zero or more times.</td>
      </tr>

      +</td>

      The preceding item will be matched one or more times.</td>
      </tr>

      {N}</td>

      The preceding item is matched exactly N times.</td>
      </tr>

      {N,}</td>

      The preceding item is matched N or more times.</td>
      </tr>

      {N,M}</td>

      The preceding item is matched at least N times, but not more than M times.</td>
      </tr>

      -</td>

      Represents the range if it's not first or last in a list or the ending point of a range in a list.</td>
      </tr>

      ^</td>

      Matches the empty string at the beginning of a line; also represents the characters not in the range of a list.</td>
      </tr>

      $</td>

      Matches the empty string at the end of a line.</td>
      </tr>

      \b</td>

      Matches the empty string at the edge of a word.</td>
      </tr>

      \B</td>

      Matches the empty string provided it's not at the edge of a word.</td>
      </tr>

      \<</td>

      Match the empty string at the beginning of word.</td>
      </tr>

      \></td>

      Match the empty string at the end of word.</td>
      </tr>
      </tbody>
      </table>

      grep vs egrep</h3>
      egrep is the same as grep -E</strong>. It interpret PATTERN as an extended regular expression. From the grep man page:

             In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{,
      \|, \(, and \).
      Traditional egrep did not support the { meta-character, and some egrep implementations support \{ instead, so portable scripts should avoid { in
      grep -E patterns and should use [{] to match a literal {.
      GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification.
      For example, the command grep -E '{1' searches for the two-character string {1 instead of reporting a syntax error in the regular expression.
      POSIX.2 allows this behavior as an extension, but portable scripts should avoid it.
      </pre>

      References:</h4>

      • man page grep and regex(7)</li>
      • info page grep</li>
        </ul>