Przeszukiwanie zawarto

Ogólne pytania dotyczące systemu
dominik92
Posty: 1
Rejestracja: 01 lipca 2015, 20:18

Przeszukiwanie zawartości dużego pliku tekstowego

Post autor: dominik92 »

Witam.

Potrzebuje przeszukać plik tekstowy o rozmiarze 8GB.
Próbowałem do tego użyć polecenia grep jednak nie przeszukuje pliku, jako wynik dostaje pusty plik.
Czy znacie jakiś sposób?

Polecenie które używałem

Kod: Zaznacz cały

grep 'wyszukiwane' plik.log > /var/wynik.txt
Pozdrawiam
Awatar użytkownika
kitek
Posty: 42
Rejestracja: 24 sierpnia 2015, 19:09

Post autor: kitek »

Cześć Dominik. Mam takie głupie pytanie: czy wymienione w Twoim poście polecenie, wykonujesz jako zwykły użytkownik, czy jako administrator/root? I jeszcze jedno: czy potrzebujesz przekierować wyjście wyniku (mam na myśli wykorzystanie '>') do pliku /var/wynik.txt? A co w przypadku, kiedy spróbujesz przekierować wynik z wykorzystaniem podwójnego znaku '>>'? W sumie, to bez sensu, ale...

Tak przy okazji: może najpierw utwórz plik wynik.txt, ale w innej lokalizacji, np. w katalogu domowym i spróbuj jeszcze raz? Piszę o tym, ponieważ:

Kod: Zaznacz cały

> nazwa_pliku
"obcina" plik do zerowej długości. I jeżeli plik nie istnieje, tworzony jest nowy o zerowej długości. Mechanizm podobny do działania polecenia touch. Ale to, tylko tzw. głośne myślenie.

Dominik pomyślałem, że może pomoże Ci krótki skrypt, który przeszuka dany plik w poszukiwaniu danego słowa, czy wzorca:

Kod: Zaznacz cały

[color=#0000ff][I]#!/bin/bash
#
# Prosty skrypt służący do wyszukania danego wzorca w 
# zdefiniowanym pliku.[/I][/color]

[color=#008000]wzorzec[/color]=linuks
[color=#008000]plik[/color]=[color=#ff8c00]/[/color]home[color=#ff8c00]/[/color]kitek[color=#ff8c00]/[/color]systemy
                               
[color=#ff8c00]if grep[/color] -q "[color=#008000]$wzorzec[/color]" "[color=#008000]$plik[/color]"  
   [color=#ff8c00]then
       echo[/color] "[color=#008000]$wzorzec[/color] [color=#00ff00]znalezniony w pliku[/color] [color=#008000]$plik[/color]"
   [color=#ff8c00]else
       echo[/color] "[color=#008000]$wzorzec[/color] [color=#00ff00]nie znaleziony w pliku[/color] [color=#008000]$plik[/color]"
[color=#ff8c00]fi[/color]
Skypt zapisujesz w pliku tekstowym, pod dowolną nazwą, np. szukacz. Oczywiście skrypt musi mieć atrybut wykonywania, który nadamy za pomocą polecenia: chmod +x szukacz. (To bardzo ważne). I teraz tak: jeżeli plik, który chcesz przeszukać znajduje się w tym samym katalogu, co powyższy skrypt, to jego działanie odnosi się, tylko do jego wywołania, w tym przypadku jako zwykłu użytkownik, czyli:

Kod: Zaznacz cały

[color=#ff0000][~]$[/color][color=#008000] ./szukacz[/color]
[color=#008000]linuks znaleziony w pliku /home/kitek/systemy[/color]
Jeżeli, będziesz chciał przeszukać katalogi, które wymagają praw administratora/roota, to uruchom skrypt właśnie z konta admina/roota albo skorzystaj z mechanizmu sudo. Jak zapewne dostrzegasz, musisz zmienić zmienne wzorzec oraz plik tak, aby pasowały Twoim wymaganiom. Niemniej, możliwe jest, aby skrypt przyjmował dowolny wzorzec oraz plik w którym ma szukać. Jest, to kwestia wykorzystania odpowiednio $1 i $2 (dla zmiennej wzorzec i plik). W takim wypadku, działanie skryptu sprowadza się do wywołania polecenia, np:

Kod: Zaznacz cały

[color=#808080][I]## pierwszy wariant, czyli wzorzec został znaleziony:
## [/I]==================================================[/color]
[color=#ff0000][~]$[/color] [color=#008000]./szukacz linuks /home/kitek/systemy-unixlike[/color]
[color=#008000]linuks znaleziony w pliku /home/kitek/systemy-unixlike[/color]

[color=#808080][I]## drugi wariant, czyli wzorzec nie został znaleziony:
## [/I]===================================================[/color]
[color=#ff0000][~]$[/color] [color=#008000]./szukacz windows /home/kitek/systemy-unixlike[/color]
[color=#008000]windows nie znaleziony w pliku /home/kitek/systemy-unixlike[/color]

A więc w tym przypadku, składnia wygląda w ten sposób: ./szukacz wzorzec_do_wyszukania nazwa_pliku.
To tylko przykład. Zdaję sobie sprawę z faktu, że ten skrypt Ci pewnie nie pomoże, ale być może ułatwi choć trochę Twoje zmagania :-)

Trzymaj się.
ODPOWIEDZ