Skip to content
Anastasis Andronidis edited this page Dec 6, 2017 · 7 revisions

Consider using grep -c instead of grep|wc.

Problematic code:

grep foo | wc -l

Correct code:

grep -c foo

Rationale:

This is purely a stylistic issue. grep can count lines without piping to wc.

Note that in many cases, this number is only used to see whether there are matches (i.e. == 0). In these cases, it's better and more efficient to use grep -q and check its exit status:

if grep -q pattern file
then
  echo "The file contains the pattern"
fi

Also note that in foo | grep bar | wc -l, wc will mask the exit code of grep by default (i.e. without set -o pipefail), and always return success. If replacing with foo | grep -c bar, grep will exit non-zero when the count is 0. This is convenient for conditional statements but may require handling when used with set -e.

Exceptions

If you e.g. want to count characters instead of lines, and you actually care about the number and not just whether it's greater than 0, you can ignore this error.

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally