1

I have a command which sends to stdout a series of numbers, each on a new line. I need to determine whether a particular number exists in the list. The match needs to be exact, not a subset. For example, a simple way to approach this that does not work would be to do:

/run/command/outputing/numbers | grep -c <numberToSearch>

My version of this gives a false positive on the following list when searching for '456':

1234567
98765
23
1771

If the count is non-zero, a match was found or if it was zero, the number is not in the list.

The issue with this is that the numberToSearch could match a subsequence of numbers on a line, instead I only want hits on the whole line. I looked at the man page for grep and did not see any way to only match whole lines. Is there a way to do this, or would I be better off using awk or sed or some other tool instead? I need a binary answer as to whether the number being search for is present or not.

1

3 Answers 3

1

Adding to Ansgar’s answer, consider -l (lower-case L) instead of -c.   It (-l) will give you a yes or no answer.

/run/command/outputting/numbers | grep –l '^456$'

will output “(standard input)” and exit with a status of 0 if a matching line is found; if the text is not found, it will output nothing and exit with a status of 1.  Some versions of grep also support a -q (quiet) option, which will suppress all output and give only the exit status.

These have the advantage that they are able to exit upon encountering the search string for the first time, and do not need to read the entire input.  If you need your command to run to completion, these options may be harmful.

5

From the GNU grep manual:

`-x'
`--line-regexp'
     Select only those matches that exactly match the whole line.
     (`-x' is specified by POSIX.)

So:

/run/command/outputing/numbers | grep -x <numberToSearch>

Will get you the whole-line matches:

/run/command/outputing/numbers | grep -cx <numberToSearch> 

Will get you number of whole-line matches.

2
num=23
/run/command/outputing/numbers | grep -c "^$num$"

Replace 23 with the number you're looking for.

1

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .