You need to use the following tools:
grep Command To Find Files By Content
Type the command as follows:
grep 'string' *.txt grep 'main(' *.c grep '#include<example.h>' *.c grep 'getChar*' *.c grep -i 'ultra' *.conf grep -iR 'ultra' *.conf
Where
- -i : Ignore case distinctions in both the PATTERN (match valid, VALID, ValID string) and the input files (math file.c FILE.c FILE.C filename).
- -R : Read all files under each directory, recursively
Highlighting searched patterns
You can highlight patterns easily while searching large number of files:
$ grep --color=auto -iR 'getChar();' *.c
Displaying file names and line number for searched patterns
You may also need to display filenames and numbers:
$ grep --color=auto -iRnH 'getChar();' *.c
Where,
- -n : Prefix each line of output with the 1-based line number within its input file.
- -H Print the file name for each match. This is the default when there is more than one file to search.
$grep --color=auto -nH 'DIR' *
Sample output:
You can also use find command:
$ find . -name "*.c" -print | xargs grep "main("
Further readings:
- find command
- grep command
- man pages find and grep
This entry is 6 of 7 in the Linux / UNIX grep Command Tutorial series. Keep reading the rest of the series:- 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
- 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
Category | List of Unix and Linux commands |
---|---|
File Management | cat |
Firewall | Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04 |
Network Utilities | dig • host • ip • nmap |
OpenVPN | CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04 |
Package Manager | apk • apt |
Processes Management | bg • chroot • cron • disown • fg • jobs • killall • kill • pidof • pstree • pwdx • time |
Searching | grep • whereis • which |
User Information | groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w |
WireGuard VPN | Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04 |
Thanks for the good tip,
But what a bout PDF files? you mentioned only text type of files which grep can work with them, I need to know the trick for the PDF files :/
Hi and tanks for all your tips!
I also find useful invoking grep with -nH, so that it also shows the file and the line that contains the pattern.
Sometimes, -E or -P options come handy too, because they allow me to search for regexp.
Have a lot of fun…
“ack” is a really better alternative to grep. It is especially useful for programmers because it skips temporary files and version control files by default and searches only on code files. It searches recursively by default. check it out.
@mhernandez,
Thanks for your post, I’ve update FAQ.
@Gokdeniz,
I will check it out ack and will update faq with it.
@mhymn,
Try offical pdf tool as follows:
acroread /a search='word' *.pdf
Appreciate all of your posts.
egrep -ri word location/folder/*
Hello,
i was trying to use the find or grep commands to search for the cp command in the ./bin directory but i couldn’t get it. could you teach me how to get it. i know it’s there. just want to try out the find and the grep commands.
@henry
find ./bin -name “cp”
If you were trying to find where cp program lies, you can use
which cp
find . -type f -name “*.c” -print \
-exec grep -s “main(” {}\;
This command should also work
when you want to copy all the files which contains the specified function name.,
find -iname “*.c” -exec grep -l ‘main(‘ {} \; -a -exec cp {} test1/ \;
If you want to get a list o file where the string match the you must use -l option: grep -l ‘main(‘ *.c
I prefer using finds -exec option instead of the pipe and xargs, because with this I managed to deal with paths containing spaces, which are not searched by using the simple pipe/xargs combination in this example.
find . -type f -print -exec grep –color=auto –no-messages -nH “search string” “{}” \;
You can deal with path containing spaces using -print0 and -0 options for find and xargs commands respectively
thanks, didn’t know that. I thought it was possible, but I didn’t know how to achieve this and so the -exec option was easier, since it’s pretty obvious to surround the {} with “.
Thanks a lot for valuable posts.
Tried
grep -iR ‘fred’ *.c
only to be told *.c : no such file or directory
of course a quick look in the sub directories does reveal some *.c files.
I really would love to know why some people think linux is better than cpm… for heavens sake doesn’t anything actually work with this mess?
Dave -R option means recursive so if you want to search for every *.c file that contains fred keyword you must type: grep -i ‘fred’ DIR/*.c, if exists *.c in DIR/SUBDIR then you must combine find, xargs and grep
Hi. Yoander, I understand Dave … and I don´t understand you :( If I read “-R : Read all files under each directory, recursively” I think that it will walk through the actual directory and if it founds a directory it will walk through it. Yes, I came from MSWindows and I know I am missing some basic concept about what ‘recursive’ is but I can not found it.
In other way, I don´t grasp the difference between:
grep -i word *.c
and
grep -iR word *.c
Thanks
I mean that Dave used a wrong syntax in order to find every *.c file that contains the fred word if you want to do that then you must type something like this:
find . -name ‘*.x’ -print0 | xargs -0 grep fred
i want to list and find the file according some condition. below is the command. it is showing the files correctly. but not in the sort order. i mean in date order.
find /somelocation/log_output -type f -ctime +40 -exec ls -l {} \;
You must use: ls -t instead of ls -l
Looking command to list out specified files out of a directory. For example, in a directory containing 10 files which have names of fruit, I want to do an ls -l and grep for only a specific three and list perms and ownership.
Directory is /fruit containing 10 fruit file names. i on;y want to ls -l three.
# ls -l /fruit | grep orange, apple, banana
Desired output should be something like:
rwxr–r– 1 root root 392 Mar 24 2009 orange
rwxr–r– 1 root root 392 Mar 24 2009 apple
rwxr–r– 1 root root 392 Mar 24 2009 banana
Unable to find the syntax to do this.
Any ideas would be appreciated.
Thx
# ls -l /fruit | egrep ‘orange|apple|banana’
This is the best solution ever, because there are only matching lines in the output.
This solution meets my expectation. Great work!