Wednesday, February 24, 2010

The grep command in Unix and Linux and its common usage

I have been using the grep command in UNIX virtually everyday in my work but yet sometimes some of the file manipulation tasks annoy me, especially the pattern matching tasks for which I always needed a quick solution, so I decided to do a writeup on grep command and its practical applications, hope this may make the life of UNIX users a little easier.


The grep series of commands.... For a customary introduction, the grep command is used to find/print lines in a file that matches a pattern, it comes in different flavors, there is an enhanced version of the grep command, namely the egrep which does some advanced regular expression pattern matching on text files and the fgrep command which is used to search text in a file without any regular expession interpretation of the search pattern.


Some common grep usage options....

grep pattern filenames - Displays lines in files which matches the pattern.

grep -i pattern filenames - Displays lines in files which matches the pattern, ignores case while matching the pattern.

grep -c pattern filenames - Prints the count of the number of lines which matches the pattern in files.

grep -l pattern filenames - Lists the names of files which matches the pattern along with the lines which matched the pattern.

Similarly egrep command is used with different enhanced pattern matching options used with regular expressions like

egrep (x|y) filename - Displays lines which match the pattern x or y.

egrep (x|y)+ filename - Displays lines which matches atleast one or more text x or y.

fgrep is mainly used to avoid using search patterns as regular expressions or metacharacters



fgrep '*' filename - matches the occurence of pattern * in filenames, note here * doesn't mean a regular expression or a metacharacter.



Applications of grep command:



grep command can be used as a standalone utility to match a pattern in a file or piped to other utility commands like sed or awk to manilupate and extract text fom files, some of the common applications of grep from simple to little tricky ones are shown below.



The text file used to illustrate the below grep commands is shown below.



bash-3.00# cat textfile.txt This is line 1This is line 2This is line 3This is line 4This is line 5bash-3.00#1. Displaying or Saving a file with line numbers



There are several ways to save or display a text file with line numbers, some of them are



bash-3.00# grep -n '^' textfile.txt 1:This is line 12:This is line 23:This is line 34:This is line 45:This is line 5The above command matches the first line of the input file ('^' matches a pattern at the beginning of a line), or it matches all the lines in a file, one can also use grep -n '$' textfile.txt to produce the same output (the regular expression '$' means "ends with").



bash-3.00# grep -n '$' textfile.txt 1:This is line 12:This is line 23:This is line 34:This is line 45:This is line 5Also one can use the Regular expression ".*" to match and print all lines in the file with line numbers.



bash-3.00# grep -n '.*' textfile.txt 1:This is line 12:This is line 23:This is line 34:This is line 45:This is line 5The RE . (dot) is used to match a single character and the pattern * is used to match zero or more occurences, thus printing all line numbers when used with grep -n.



2. Deleting or Removing all lines in a file which matches a pattern
The grep -v command can be used display lines which DON'T match a pattern or in other words remove lines which matches a pattern in a file.


For example in the above text file, to remove or delete lines which matches the pattern "line 1", the command would be

bash-3.00# grep -v "line 1" textfile.txt This is line 2This is line 3This is line 4This is line 5To delete lines which matches the pattern "line 1" or "line 3", use the egrep command


bash-3.00# egrep -v '(line 1
line 3)' textfile.txt This is line 2This is line 4This is line 53. Deleting the first line which matches a pattern in a file

This is an example which uses the grep command piped to other UNIX commands like sed. To delete only the first line which matches a pattern in a file, use the following grep - sed pipe.

The below command deletes the first line which matches the pattern "line" in the above text file.


bash-3.00# grep "line" textfile.txt
sed 1dThis is line 2This is line 3This is line 4This is line 5The sed 1d command deletes the first line in the above grep output.

4. Deleting the last line which matches a pattern in a file


To delete the last line which matches a pattern in a file, use the grep - sed command pipe as shown below.

The below command deletes the last line which matches the pattern "line" in the above text file.

bash-3.00# grep "line" textfile.txt
sed '$d'This is line 1This is line 2This is line 3This is line 4The sed $d command deletes the last line in the above grep output.


Likewise there are countless applications of grep command piped with other utility commands like awk, sed, etc to match patterns in a file and I will add more as and when I find something interesting.



No comments:

Post a Comment