How do I grep from a number of files and display the file name only? How do I force the grep command to display the filename before the matching lines in its output?
When there is more than one file to search it will display file name by default. Consider the following grep command:
grep "word" filename grep root /etc/* |
Sample outputs:
/etc/bash.bashrc: See "man sudo_root" for details. /etc/crontab:17 * * * * root cd / && run-parts --report /etc/cron.hourly /etc/crontab:25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) /etc/crontab:47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) /etc/crontab:52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) /etc/group:root:x:0: grep: /etc/gshadow: Permission denied /etc/logrotate.conf: create 0664 root utmp /etc/logrotate.conf: create 0660 root utmp
The first name is file name (e.g., /etc/crontab, /etc/group). The -l option will only print filename if the match found by the grep:
grep -l "string" filename grep -l root /etc/* |
Sample outputs:
/etc/aliases /etc/arpwatch.conf grep: /etc/at.deny: Permission denied /etc/bash.bashrc /etc/bash_completion /etc/ca-certificates.conf /etc/crontab /etc/group
You can suppress normal output; instead print the name of each input file from which no output would normally have been printed:
grep -L "word" filename grep -L root /etc/* |
Sample outputs:
/etc/apm /etc/apparmor /etc/apparmor.d /etc/apport /etc/apt /etc/avahi /etc/bash_completion.d /etc/bindresvport.blacklist /etc/blkid.conf /etc/bluetooth /etc/bogofilter.cf /etc/bonobo-activation /etc/brlapi.key
How to display filename before matching line in grep
By default grep display filename if you provide multiple filenames. For example:
grep 'foo' file1 file2
grep '192.168.2.254' /etc/hosts /etc/resolv.conf
grep -n '192.168.2.254' /etc/hosts /etc/resolv.conf
####################################################
## Always show filename headers with output lines.##
## Works with BSD/macOS/GNU/Linux grep version ##
####################################################
grep -H 'search-word' filename1 filename2
grep '192.168.2.254' /etc/hosts /dev/null
##########################
### gnu/Linux grep only ##
##########################
grep --with-filename 'foo' file1 file2
grep --with-filename '192.168.2.253' /etc/{hosts,resolv.conf}
Conclusion – Grep from files and display the file name
Let us summaries all the grep command option in Linux or Unix:
- grep -l 'word' file1 file2 : Display the file name on Linux and Unix instead of normal output
- grep -L 'string' file1 file2 : Suppress normal output and show filenames from which no output would normally have been printed
- grep -n 'string' filename : Force grep to add prefix each line of output with the line number within its input file
- grep --with-filename 'word' file OR grep -H 'bar' file1 file2 file3: Print the file name for each match
- How To Use grep Command In Linux / UNIX
- Regular Expressions In grep
- Search Multiple Words / String Pattern Using grep Command
- Grep Count Lines If a String / Word Matches
- Grep From Files and Display the File Name
- How To Find Files by Content Under UNIX
- grep command: View Only Configuration File Directives