shmnsw
shmnsw

Reputation: 649

Unix syntax for the grep command for only an ending character

For the file james, when I run this command:

cat james | grep ["."]

I get only the lines that contain a dot.

How do I get only the lines that end with a dot?

Upvotes: 3

Views: 2919

Answers (3)

Junior Dussouillez
Junior Dussouillez

Reputation: 2397

You can use a regular expression. This is what you need :

cat james | grep "\.$"

Look at grep manpage for more informations about regexp

Upvotes: 1

Keith Thompson
Keith Thompson

Reputation: 263217

To find lines that end with a . character:

grep '\.$' james

Your cat command is unnecessary; grep is able to read the file itself, and doesn't need cat to do that job for it.

A . character by itself is special in regular expressions, matching any one character; you need to escape it with a \ to match a literal . character.

And you need to enclose the whole regular expression in single quotes because the \ and $ characters are special to the shell. In a regular expression, $ matches the end of a line. (You're dealing with some characters that are treated specially by the shell, and others that are treated specially by grep; the single quotes get the shell out of the way so you can control what grep sees.)

As for the square brackets you used in your question, that's another way to escape the ., but it's unusual. In a regular expression, [abc] matches a single character that's any of a, b, or c. [.] matches a single literal . character, since . loses its special meaning inside square brackets. The double quotes you used: ["."] are unnecessary, since . isn't a shell metacharacter -- but square brackets are special to the shell, with a similar meaning to their meaning in a regular expression. So your

grep ["."]

is equivalent to

grep [.]

The shell would normally expand [.] to a list of every visible file name that contains the single character .. There's always such a file, namely the current directory . -- but the shell's [] expansion ignores files whose names start with .. So since there's nothing to expand [.] to, it's left alone, and grep sees [.] as an argument, which just happens to work, matching lines that contain a literal . character. (Using a different shell, or the same shell with different settings, could mess that up.)

Note that the shell doesn't (except in some limited contexts) deal with regular expressions; rather it uses file matching patterns, which are less powerful.

Upvotes: 5

Paulo Almeida
Paulo Almeida

Reputation: 8061

You need to use $, which signals the end of the line:

cat james | grep ["."]$

This also works:

cat james |grep "\.$"

Upvotes: 1

Related Questions