I thought * meant zero or more of the character or class that precedes it in basic or extended regex. Why does echo hello| grep '*llo' fail but echo hello |egrep '*llo' succeed?


When using grep/egrep/fgrep, you can include the -o flag to cause grep to return just the characters that matched. (if you have a nice color terminal you might also try --color so that it highlights the match in the returned lines. It often helps in cases like this.

echo "that star " | grep -o '*count'
echo "that star " | egrep -o '*count'
echo "that star " | fgrep -o '*count'
echo "that star counted" | grep -o '*count'
echo "that star counted" | egrep -o '*count'  ## returns "count"
echo "that star counted" | fgrep -o '*count'
echo "that star *counted" | grep -o '*count'  ## returns "*count"
echo "that star *counted" | egrep -o '*count'  ## returns "count"
echo "that star *counted" | fgrep -o '*count'  ## returns "*count"

The ones without comments returned nothing.

So the difference is that the old grep and fgrep parsers, when they dodn't see a character or set before the star, choose to treat it as a normal character to match. egrep treats it as a no-op or invalid and silently continues.

(one more note, I sometimes use pcregrep for perl regex compatibility, and it actually throws up an error message when the regex starts with an asterisk!)




In regular expressions the asterisk is used to find pattern of the character prEceding it, not prOceding it.

In other words you should say echo hello | grep 'llo*' to find 'llo' or 'lloooo' etc. to match more letters in a pattern, enclose it with parenthesis. (llo)* would find llo, llollo etc.

I'm guessing grep with a * fails because it's not a valid regular expression while egrep just ignores the *.

  • 1
    Your example would actually find 'll', 'llo', 'lloo', 'llooo' and so forth. The * only grabs 1 character unless it is preceded by a group or set. – Mark Apr 8 '13 at 17:31
  • I would think that '*llo' would basically be passing a null value to the * operator, but shouldn't it be ignored if there is no match anyways since it's a '0' or more operator? Furthermore, how do we determine whether the * is an operator for basic regex versus being a glob/wildcard character? The shell is compiled with glob libraries which allow it to expand * to match certain things, but is grep compiled with that library? – user160910 Apr 8 '13 at 17:33
  • @Mark, you're very right. I corrected my answer to reflect that. – Snowburnt Apr 8 '13 at 18:40
  • @GreggLeventhal If it is part of the regular expression it looks like grep ignores it while egrep flips out. If it is part of the file input you can use * as a glob wildcard. – Snowburnt Apr 8 '13 at 18:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy