How Do I Select Certain Records From a File?
call No Starch Press at this number: 800/420-7240.
noted that recently, an alarming number of alien spacecrafts
among colleagues at a number of different organizations
Here, grep has pulled out just the lines that contain the word number. The first line is obviously what you were after, while the others just happened to match the pattern. The general form of the grep command is this:
grep <flags> <pattern> <files>
The most useful grep flags are shown here:
-i Ignore uppercase and lowercase when comparing.
-v Print only lines that do not match the pattern.
-c Print only a count of the matching lines.
-n
Display the line number before each matching line.
When grep performs its pattern matching, it expects you to provide a regular expression for the pattern. Regular expressions can be very simple or quite complex, so we won't get into a lot of details here. Here are the most common types of regular expressions:
abc Match lines containing the string "abc" anywhere.
^abc Match lines starting with "abc."
abc$ Match lines ending with "abc."
a..c Match lines containing "a" and
"c" separated by any two characters (the dot matches any single character).
a.*c Match lines containing "a" and "c" separated by any number of characters (the dot- asterisk means match zero or more characters).
Regular expressions also come into play when using vi, sed, awk, and other Unix commands. If you want to master Unix, take time to understand regular expressions. Here is a sample poem.txt file and some grep commands to demonstrate regular-expression pattern matching:
Mary had a little lamb
Mary fried a lot of spam
Jack ate a Spam sandwich
Jill had a lamb spamwich
To print all lines containing spam (respecting uppercase and lowercase), enter
grep 'spam' poem.txt
Mary fried a lot of spam
Jill had a lamb spamwich
To print all lines containing spam (ignoring uppercase and lowercase), enter
grep -i 'spam' poem.txt
Mary fried a lot of spam
Jack ate a Spam sandwich
Jill had a lamb spamwich
To print just the number of lines containing the word spam (ignoring uppercase and lowercase), enter
grep -ic 'spam' poem.txt
3
To print all lines not containing spam (ignoring uppercase and lowercase), enter
grep -i -v 'spam' poem.txt
Mary had a little lamb
To print all lines starting with Mary, enter
grep '^Mary' poem.txt
Mary had a little lamb
Mary fried a lot of spam
To print all lines ending with ich, enter
grep 'ich$' poem.txt
Jack ate a Spam sandwich
Jill had a lamb spamwich
To print all lines containing had followed by lamb, enter
grep 'had.*lamb' poem.txt
Mary had a little lamb
Jill had a lamb spamwich
If you want to learn more about regular expressions, start with the man regexp command. There's also a good book called Mastering Regular Expressions, by Jeffrey Friedl, published by O'Reilly & Associates.
For more information on the grep command, see the grep manual.
Previous Lesson: Selecting Columns
Next Lesson: Search & Replace
Comments - most recent first
(Please feel free to answer questions posted by others!)
cut -c807
to isolate the 807th character.
Thanks for the tutorial. It's helping me as I read another book on Linux.
Though very good (it covers all flavours of Linux), I find myself having to refer to your website to expound and understand particular commands, like 'grep'.
Thanks, and have just recommended your site to a friend dipping his toes into Linux!
Keep up the good work.
I have a lot of text files and each one have registers, I need count how many records has some particular value in a fix position, if I use grep command count the registers that contains the search value, independent their possition, do you know some command that can help me?
My table list
$ cat table.list
ACTIVE_LOGINS
AB$_BC$_MEM_MC_G
ATTACHMENT
also in the same directory there are files such as:
$
$ ls -1 *AB*
index_AB$_TABLE1_I.sql.TEMPLATE
table_AB$_BC$_MEM_MC_G.sql.TEMPLATE
view_AB$BC$_MEM_MC_S.sql
My Requirement logic:
for table in `cat table.list`
do
echo table=$table
ORIG_TABLE_FILE=`ls | egrep "(^p_|^table_)"${table}".sql.TEMPLATE`
echo ORIG_TABLE_FILE=$ORIG_TABLE_FILE
for file in $(egrep "(ON ${table} \()|(TABLE ${table}\$)" `ls . | grep -v ^table_ | grep -v ^p_` | cut -f1 -d: | uniq)
do
echo file=$file
done
done
grep 'number' /var/mail/hermie
can call No Starch Press at 800/420-7240. Office hours are
No number on this line :).
A useful addition to this page is recursive use of grep. Lots of folks search and ask about this and it's use is NOT obvious cos of shell wildcard expansion.
Example:
Search all 'c' source files in this and sub directories for the text 'link(something) list' starting at the current directory.
Don't use: grep -r 'link.* list' *.c (doesn't work - file not found)
Use: grep -r 'link.* list' . --include "*.c"
(of course this presumes that ur copy of grep actually has the recurse functionality built in otherwise u will need to combine find & grep)
Hope this helps others.
I welcome your comments. However... I am puzzled by many people who say "Please send me the Linux tutorial." This website *is* your Linux Tutorial! Read everything here, learn all you can, ask questions if you like. But
don't ask me to send what you already have. :-) NO SPAM! If you post garbage, it will be deleted, and you will be banned.
Copyright © by -
All rights reserved - Redistribution is allowed only with permission.

