?
Solved

String search in multiple gziped files

Posted on 2004-10-14
7
Medium Priority
?
1,176 Views
Last Modified: 2012-06-21
I looked through the previous solutions, but did not find this specific anwer.

When I grep for a string in a list of regular files, it shows what file the string is in when it lists the occurances of the string.

I realize to do a string search in a directory of gzipped files, I can

gzcat * | grep -i Error

But, this only shows the occurance of the string and does not show which files the string occurs in.  So, I have to do the search manually against each file in the directory.  What do I do to have the output of  " gzcat * | grep -i Error "  show which files it finds the string.  Thanks for your help!

0
Comment
Question by:theoradically
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
7 Comments
 
LVL 14

Accepted Solution

by:
chris_calabrese earned 100 total points
ID: 12311907
You want something along the lines of

ls *.gz | while read file
do  gzcat "$file" | grep -i Error | while read line
      do echo "$file: $line"
      done
done
0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 12312025
zgrep
0
 
LVL 48

Assisted Solution

by:Tintin
Tintin earned 400 total points
ID: 12312137
or possibly gzgrep depending on what Unix flavour you are on.
0
Optimize your web performance

What's in the eBook?
- Full list of reasons for poor performance
- Ultimate measures to speed things up
- Primary web monitoring types
- KPIs you should be monitoring in order to increase your ROI

 
LVL 2

Expert Comment

by:stokesj56
ID: 12324823
An alternate that will print the file name above the lines that match:

echo *.gz | while read FN
do
    echo "${FN}:"
    gzcat "$FN" | grep -i Error
    echo ""
done

This will print every file name. If you want to only see the file names that contain the search then do something like this:

echo *.gz | while read FN
do
    gzcat "$FN" | grep -q Error
    if [ $? -eq 0 ]
    then
        echo "${FN}:"
        gzcat "$FN" | grep -i Error
        echo ""
    fi
done

This will be a little slower because it does 2 greps.
0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 12331591
re-enventing the wheel :-(
if there's a zcat, there's zgrep too
0
 

Author Comment

by:theoradically
ID: 12340105
gzgrep is what I was looking for - thanks tintin
gzgrep -i Error * - gives the filename and occurance of the string within it


Chris - your script worked , but was a little more than I was looking for


BYW,

when I do      which zcat  -   I get ... /bin/zcat
when I do      which zgrep -  I get    -   no zgrep in .....

Thanks for your input
0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 12340650
if the name is zgrep or gzgrep depends on your installation, rpm, make, whatever ...
anyway, you found what you need
0

Featured Post

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In tuning file systems on the Solaris Operating System, changing some parameters of a file system usually destroys the data on it. For instance, changing the cache segment block size in the volume of a T3 requires that you delete the existing volu…
Installing FreeBSD… FreeBSD is a darling of an operating system. The stability and usability make it a clear choice for servers and desktops (for the cunning). Savvy?  The Ports collection makes available every popular FOSS application and packag…
Learn how to navigate the file tree with the shell. Use pwd to print the current working directory: Use ls to list a directory's contents: Use cd to change to a new directory: Use wildcards instead of typing out long directory names: Use ../ to move…
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.
Suggested Courses
Course of the Month13 days, 7 hours left to enroll

800 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question