Grep Help


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Grep Help
# 1  
Old 06-21-2011
Grep Help

Ok, so I'm new to my company and I don't have a lot of permissions. I'm using (ksh) Unix and I have two questions.

1.) When I grep for a string and it lists this, the directories are : cat,dog,mouse

grep: can't open dog
grep: can't open cat

I know that this means that I don't have permission to these files, but does it also mean that grep searched mouse and didn't find what I was looking for?

2.) How can I grep in a directory but ignore one specific directory? I tried

grep -il "string" * | grep -v "file.out"

Thanks, Brick
# 2  
Old 06-21-2011
Quote:
Originally Posted by brickdrop
Ok, so I'm new to my company and I don't have a lot of permissions. I'm using (ksh) Unix and I have two questions.

1.) When I grep for a string and it lists this, the directories are : cat,dog,mouse

grep: can't open dog
grep: can't open cat

I know that this means that I don't have permission to these files, but does it also mean that grep searched mouse and didn't find what I was looking for?
Grep works on files, not directories. When you give it a directory it'll complain.

If mouse is a file and nothing was printed, then nothing in mouse matched. Whether grep was looking for what you thought it was, I have no idea, since you didn't say what you actually typed.
Quote:
2.) How can I grep in a directory but ignore one specific directory? I tried

grep -il "string" * | grep -v "file.out"

Thanks, Brick
That doesn't go inside directories anyway, so will be be complaining about then ignoring any directories * finds.

What do you want grep to look in and what do you want it to ignore?
# 3  
Old 06-21-2011
In portable grep, it works against files or stdin. So... grep doesn't really process directories. When you supply a globbing wildcard like "grep some-string *", the asterisk is expanded by the shell itself to match all patterns in the directory location your in.

If you want to perform a grep on files inside of a whole directory tree, look at using "find" instead. Despite the name, "find" is not grep... all find does is find files (files can be directories.... but not important for right now). There is an "-exec" option to "find" that will allow you to execute a command for matched file patterns, but likely you may want to pipe the output of "find" to "xargs" to do the grep command....

There is also a "-prune" option to find that can be used to exclude "find" matches and it can be used to match a directory name and it's contents will not be searched through. However, the "-prune" option works from a valid match, which may mean that the pattern specified could match in multiple places within a tree... making the "-prune" perhaps not so desirable. I know this is getting a bit confusing.

Consider:

Code:
find . -type f -print

That returns all files in the current directory and all files within the whole tree.

Let's say one of the directories underneath the current directory is called "test3"... and let's say that it contains a file called "test.txt". Then:

Code:
find . -type d -name test3 -prune -o -type f -print

This lists out all of the files but skipping any and ALL directories called test3 (you can see how that might not be exactly what you want since a directory called test1 underneath the current directory could also contain a test3 directory and the files there would not be output either).

Ok.. so far, all we're doing is generating a list of files to be searched on... here's where "xargs" comes in.

Code:
find . -type d -name test3 -prune -o -type f -print | xargs grep somestring

That should grep for somestring inside of all files that are not nested below a directory called "test3". However, there are STILL some problems.

First problem is that we probably like it (??) when grep tells us the name of the file where the match resides. The "xargs" command will process the file list coming into it and invoke whatever command (i.e. grep in our case) however many times needed to process the most files that will fit in the shell buffer (imagine find returning a large set of files... you can't invoke grep with a large glob matching wildcard either... blows up the max size of the shell line buffer... so xargs executes grep how ever many times as needed to process the entire list of files coming into it). The problem is when grep is invoked on just a single file... by default, you won't get the filename printed for the match. One solution is to pass a dummy extra file coming into the xargs at the very end. This ensures that a final one file grep is performed on our dummy file.

Code:
(find . -type d -name test3 -prune -o -type f -print; echo .) | xargs grep somestring

Of course.. all of that only works if none of the files returned contain certain special characters, for example, spaces. Spaces mess everything up. In the case with spaces, you either have to use GNU find and the -print0 option (and the corresponding GNU xargs -0 option)... or you can simulate the same sort of thing by filtering the output and escaping the unwelcome filename characters with an intermediate "sed" (for example) in between the "find" and "xargs" pipelines... but I've probably already said more than you needed to know. Probably confused more than helped...
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Inconsistent `ps -eaf -o args | grep -i sfs_pcard_load_file.ksh | grep -v grep | wc -l`

i have this line of code that looks for the same file if it is currently running and returns the count. `ps -eaf -o args | grep -i sfs_pcard_load_file.ksh | grep -v grep | wc -l` basically it is assigned to a variable ISRUNNING=`ps -eaf -o args | grep -i sfs_pcard_load_file.ksh |... (6 Replies)
Discussion started by: wtolentino
6 Replies

2. UNIX for Dummies Questions & Answers

Piping grep into awk, read the next line using grep

Hi, I have a number of files containing the information below. """"" Fundallinfo 6.3950 14.9715 14.0482 """"" I would like to grep for Fundallinfo and use it to read the next line? I ideally would like to read the three numbers that follow in the next line and... (2 Replies)
Discussion started by: Paul Moghadam
2 Replies

3. UNIX for Dummies Questions & Answers

Bash - CLI - grep - Passing result to grep through pipe

Hello. I want to get all modules which are loaded and which name are exactly 2 characters long and not more than 2 characters and begin with "nv" lsmod | (e)grep '^nv???????????? I want to get all modules which are loaded and which name begin with "nv" and are 2 to 7 characters long ... (1 Reply)
Discussion started by: jcdole
1 Replies

4. Shell Programming and Scripting

AWK/GREP: grep only lines starting with integer

I have an input file 12.4 1.72849432773174e+01 -7.74784188610632e+01 12.5 9.59432114416327e-01 -7.87018212757537e+01 15.6 5.20139995965960e-01 -5.61612429666624e+01 29.3 3.76696387248366e+00 -7.42896194101892e+01 32.1 1.86899877018077e+01 -7.56508762501408e+01 35 6.98857157014640e+00... (2 Replies)
Discussion started by: chrisjorg
2 Replies

5. UNIX for Dummies Questions & Answers

Advanced grep'in... grep for data next to static element.

I have a directory I need to grep which consists of numbered sub directories. The sub directory names change daily. A file resides in this main directory that shows which sub directories are FULL backups or INCREMENTAL backups. My goal is to grep the directory for the word "full" and then... (2 Replies)
Discussion started by: SysAdm2
2 Replies

6. UNIX for Dummies Questions & Answers

Difference between grep, egrep & grep -i

Hi All, Please i need to know the difference between grep, egrep & grep -i when used to serach through a file. My platform is SunOS 5.9 & i'm using the korn shell. Regards, - divroro12 - (2 Replies)
Discussion started by: divroro12
2 Replies

7. Shell Programming and Scripting

grep for certain files using a file as input to grep and then move

Hi All, I need to grep few files which has words like the below in the file name , which i want to put it in a file and and grep for the files which contain these names and move it to a new directory , full file name -C20091210.1000-20091210.1100_SMGBSC3:1000... (2 Replies)
Discussion started by: anita07
2 Replies

8. UNIX for Dummies Questions & Answers

| help | unix | grep (GNU grep) 2.5.1 | advanced regex syntax

Hello, I'm working on unix with grep (GNU grep) 2.5.1. I'm going through some of the newer regex syntax using Regular Expression Reference - Advanced Syntax a guide. ls -aLl /bin | grep "\(x\)" Which works, just highlights 'x' where ever, when ever. I'm trying to to get (?:) to work but... (4 Replies)
Discussion started by: MykC
4 Replies

9. UNIX for Dummies Questions & Answers

| help | unix | grep - Can I use grep to return a string with exactly n matches?

Hello, I looking to use grep to return a string with exactly n matches. I'm building off this: ls -aLl /bin | grep '^.\{9\}x' | tr -s ' ' -rwxr-xr-x 1 root root 632816 Nov 25 2008 vi -rwxr-xr-x 1 root root 632816 Nov 25 2008 view -rwxr-xr-x 1 root root 16008 May 25 2008... (7 Replies)
Discussion started by: MykC
7 Replies

10. Shell Programming and Scripting

MEM=`ps v $PPID| grep -i db2 | grep -v grep| awk '{ if ( $7 ~ " " ) { print 0 } else

Hi Guys, I need to set the value of $7 to zero in case $7 is NULL. I've tried the below command but doesn't work. Any ideas. thanks guys. MEM=`ps v $PPID| grep -i db2 | grep -v grep| awk '{ if ( $7 ~ " " ) { print 0 } else { print $7}}' ` Harby. (4 Replies)
Discussion started by: hariza
4 Replies
Login or Register to Ask a Question