Grep From Files and Display the File Name On Linux or Unix System

ADVERTISEMENTS



grep "word" filename grep root / etc /* grep "word" filename grep root /etc/*

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

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 /* 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 /* 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}





grep show filename before matching line

In this example, I need to search for ‘http://www.cyberciti.biz’ in all files and display matched filenames only, run:

grep -l -R 'http://www.cyberciti.biz'

Now replace all occurrences of ‘http://www.cyberciti.biz’ with ‘https://www.cyberciti.biz’ using the sed command:

## get filenames ## files =$ ( grep -l -R 'http://www.cyberciti.biz' . ) echo " $files " ## replace using sed ## for f in $files do sed -i 's+http://www.cyberciti.biz+https://www.cyberciti.biz+g' " $f " done ## get filenames ## files=$(grep -l -R 'http://www.cyberciti.biz' . ) echo "$files" ## replace using sed ## for f in $files do sed -i 's+http://www.cyberciti.biz+https://www.cyberciti.biz+g' "$f" done

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