How to include a space character with grep?

I have a file named example

$ cat example

kali.pdf
linux.pdf
ubuntu.pdf
example.pdf.
this.pdf
grep .pdf

and when I use grep to get the line that has a space before .pdf, I can't seem to get it.

grep *.pdf example

returns nothing, (I want to say, "grep, match zero or more spaces before .pdf", but no result)

and if I use:

grep i*.pdf example

kali.pdf
linux.pdf
ubuntu.pdf
example.pdf.
this.pdf
grep .pdf

all lines return, because I'm saying "grep, match me i one or zero times, ok."

and lastly:

grep " *.pdf" example

no result returns

For this sample, I want to see

grep .pdf 

as output

What is wrong with my thought?


Solution 1:

Make sure you quote your expression.

$ grep ' \.pdf' example
grep .pdf

Or if there might be multiple spaces (we can't use * as this will match the cases where there are no preceding spaces)

grep ' \+\.pdf' example

+ means "one or more of the preceding character". In BRE you need to escape it with \ to get this special function, but you can use ERE instead to avoid this

grep -E ' +\.pdf' example 

You can also use \s in grep to mean a space

grep '\s\+\.pdf' example

We should escape literal . because in regex . means any character, unless it's in a character class.