Jak przeszukać pliki w spakowanych archiwach GZ i znaleźć dowolny tekst?

W wielu systemach logi i inne pliki archiwizuje się przy pomocy GZIP. Czasami zachodzi jednak potrzeba poszukania w którym z tych plików znajduje się konkretny tekst. Przejdźmy wpierw do przykładu.

W naszym katalogu znajdują się pliki:

plik.gz
plik1.gz
plik2.gz
plik3.gz
plik4.gz

Szukamy informacji w którym z archiwum znajduje się ciąg znaków “szukany tekst“. Chcemy również wyświetlić całą linię w której znajduje się poszukiwana fraza. Jak zatem możemy tego dokonać?

Skorzystamy z polecenia gunzip, którego składnia wygląda następująco:

gunzip -c plik.gz | grep "szukany tekst"

Powyżej wskazaliśmy konkretny plik w którym dokonujemy poszukiwań. Ponieważ w pliku plik.gz znajdowała się szukana fraza otrzymaliśmy wynik jak poniżej:

w trakcie poszukiwania znaleziono szukany tekst

Możemy również wykonać poniższe polecenie, które przeszuka wszystkie pliki GZ w bieżącym katalogu:

gunzip -c *.gz | grep "szukany tekst"

W ten sposób dowiemy się czy w którymś pliku znajduje się “szukany tekst“. Jego wynik jest następujący:

w trakcie poszukiwania znaleziono szukany tekst
szukany tekst znalazł się również w tym pliku

Z wyniku widzimy, że fraza “szukany tekst” została znaleziona dwa razy. Nie wiemy jednak, czy szukany tekst znajduje się w jednym czy wielu plikach, a tym bardziej konkretnie w których plikach. Jak możemy zatem się tego dowiedzieć? Stosując np. pętle for. Spójrzmy na poniższy przykład:

for plik in `ls -1 *.gz`;
do

linia=`gunzip -c $plik | grep "szukany tekst"`

echo $plik " ->" $linia

done

W wyniku powyższego polecenia otrzymaliśmy:

plik.gz -> w trakcie poszukiwania znaleziono szukany tekst
plik1.gz ->
plik2.gz ->
plik3.gz -> szukany tekst znalazł się również w tym pliku
plik4.gz ->

Zatem jak widzimy, “szukany tekst” znajduje się w plikach: plik.gz oraz plik3.gz.