Linux – Show the matching count of all files that contain a word

command linegreplinux

What is the single command used to identify only the matching count of all lines within files under the /etc directory that contain the word "HOST"?

I should list only the files with matches and suppress any error messages.

Best Answer

To count the matches, listing only the filename(s) and count:

grep -src HOST /etc/*

Example output:

/etc/postfix/postfix-files:1
/etc/security/pam_env.conf:6
/etc/X11/app-defaults/Ddd.3.3.11:1
/etc/X11/app-defaults/Ddd:1
/etc/zsh/zshrc:0
/etc/zsh/zshenv:0

The -c option supresses normal output and prints a match count for each file.

If you'd like to suppress the files with zero counts:

grep -src HOST /etc/* | grep -v ':0$'

To print the line number (-n) and file name (-H) for each matching line for any number of input files:

grep -srnH HOST /etc/*

Example output:

/etc/lynx-cur/lynx.cfg:254:.h2 LYNX_HOST_NAME
/etc/lynx-cur/lynx.cfg:255:# If LYNX_HOST_NAME is defined here or in userdefs.h, it will be
/etc/X11/app-defaults/Ddd.3.3.11:8005:    DDD 3.3.11 (@THEHOST@) gets @CAUSE@\n\
/etc/X11/app-defaults/Ddd:8010:    DDD 3.3.12 (@THEHOST@) gets @CAUSE@\n\

The option -r causes grep to recursively search files in each subdirectory at all levels under the specified directory. The -s option suppresses error messages.

To suppress matches of binary files, use the -I option.

See man grep for more information.

Related Question