There are two sides to grep – like any command, there’s the learning of syntax, the beginning
of which I covered in the grep tool tip. I’ll
come back to the syntax later, because there is a lot of it.
However, the more powerful side is grep‘s use of regular expressions. Again, there’s not room
here to provide a complete rundown, but it should be enough to cover 90% of usage. Once I’ve got a library
of grep-related stuff, I’ll post an entry with links to them all, with some covering text.
This or That
Without being totally case-insensitive (which -i) does,
we can search for “Hello” or “hello” by specifying the optional
characters in square brackets:
$ grep [Hh]ello *.txt test1.txt:Hello. This is test file. test3.txt:hello test3.txt:Hello test3.txt:Why, hello there!
If we’re not bothered what the third letter is, then we can say “grep [Hh]e.o *.txt“, because the dot (“.”) will match any single character.
If we don’t care what the third and fourth letters are, so long as it’s “he..o”, then we say exactly that: “grep he..o” will match “hello”, hecko”, heolo”, so long as it is “he” + 1 character + “lo”.
If we want to find anything like that, other than “hello”, we can do that, too:
$ grep he[^l]lo *.txt test2.txt:heclo test3.txt:hewlo test3.txt:hello
Notice how it doesn’t pick up any of the “Hello” variations which have a “llo” in them?
How many?!
We can specify how many times a character can repeat, too. We have to put the expression we’re talking about in [square brackets]:
- “?” means “it might be there”
- “+” means “it’s there, but there might be loads of them”
- “*” means “lots (or none) might be there”
So, we can match “he”, followed by as many “l”s as you like (even none), followed by an “o” with “grep he[l]*o *.txt“:
$ grep he[l]*o *.txt test2.txt:helo test3.txt:hello test3.txt:Why, hello there! test3.txt:hellllo