[bash] wyszukiwanie za pomoca grep

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
maxblink
Piegowaty Guziec
Piegowaty Guziec
Posty: 27
Rejestracja: 25 cze 2008, 14:39
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME
Kontakt:

[bash] wyszukiwanie za pomoca grep

Post autor: maxblink »

Witam,
mam takie pytanie, mam Ksiazke o podstawach linuxa, i mniewdzy innymi jest temat poswiecony komendzie GREP, probowalem zeby mi z mojego katalogu gdzie mam pliki textowe, zapisywal do pliku CG, wpszystkie nazwy plikow w ktorych zawartosci pojawila sie ta linijka:

"BNET\\auth\\command_groups"

Wie ktos jak to dokladnie za pomoca grep soe robi?
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: leon1313 »

Kod: Zaznacz cały

#!/bin/bash
katalog="/home/irmina"
stringi="wwwww"

for plik in ${katalog}/* ; do if [ `cat ${plik} 2>/dev/null | grep -c ${stringi}` -gt 0 ]; then echo ${plik}; fi; done
jedno z rozwiązań, chyba działa :-)

p.s idiot ze mnie, komlikuje sobie życie:

Kod: Zaznacz cały

#!/bin/bash
katalog="/home/irmina"
stringi="wwww"

for plik in ${katalog}/* ; do grep -l ${stringi} ${plik};  done
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
maxblink
Piegowaty Guziec
Piegowaty Guziec
Posty: 27
Rejestracja: 25 cze 2008, 14:39
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME
Kontakt:

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: maxblink »

#!/bin/bash
katalog="/home/irmina"
stringi="wwww"

for plik in ${katalog}/* ; do grep -l ${stringi} ${plik}; done


hmm

w stringi co mam wpisac?

bo katalog, to pewnie docelowy...
/home/xxx/pvpgn/var/users

i tu mam mase plikow txt oznaczajacych konta uzytkownikow, to czyli skrypt ma wygladac tak?:

#!/bin/bash
katalog="/home/xxx/pvpgn/var/users"
stringi="wwww"

for plik in ${katalog}/* ; do grep -l ${stringi} ${plik}; done

?

tylko walsnie gdzie mam wpisac sciezke gdize ma sie wynik zapisywac?:)

bo chcialbym zeby sie zapisywalo w: /home/xxx/wyniki/
pod nazwa CG
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: leon1313 »

W stringi wpisujesz tą zawartość, która ma być znaleziona w pliku. katalog to miejsce, gdzie ma szukać plików z tą zawartością.
Jeżeli chcesz, aby ci zapisywałoza kazdym razem wyniki w /home/xxx/wyniki, to:

Kod: Zaznacz cały

#!/bin/bash
echo "" > /home/xxx/wyniki ;
katalog="/home/irmina" ;
stringi="wwww" ;

for plik in ${katalog}/* ; do grep -l ${stringi} ${plik} >> /home/xxx/wyniki;  done
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
maxblink
Piegowaty Guziec
Piegowaty Guziec
Posty: 27
Rejestracja: 25 cze 2008, 14:39
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME
Kontakt:

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: maxblink »

Nie no super:) wszystko gra:) dzieki wielkie, a mam jeszcze jedno pytanie :)

mianowicie w tym samym katalogu i w tych samych plikach mam jeszcze taka linijka:

"BNET\\acct\\lastlogin_time"="1224693755"

to jest data ostatniego LOGOWANIA, tylko nie wiem jak rozgrysc zeby mi to normalnie pokazywalo [normalny format]

Ale ogolnie to chcialbym wiedziec czy ejst opcja na skrypt zeby pokazywalo mi wszystkie nazwy [tak jak w poprzednim] ale w ktorych ostatnie logowanie bylo wiecej jak 2 miesiace temu... da rade takie cos?
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: leon1313 »

to zależy jaka formę przyjmuje ta data..
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
maxblink
Piegowaty Guziec
Piegowaty Guziec
Posty: 27
Rejestracja: 25 cze 2008, 14:39
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME
Kontakt:

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: maxblink »

hmm ogolnie takiemu last loginowi:
Wed Oct 22 18:42 2008
wg. pliku przypada taki:
"BNET\\acct\\lastlogin_time"="1224693755"
...

a moze poprostu da sie napsiac cos takiego ze zapisze mi do pliku nazwy plikow z tego katalogu, ktore byly edytowane 60 dni temu, [te co ponizej 60 dni zeby nie byly pokazywane]

da rade tak?
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: leon1313 »

Kod: Zaznacz cały

#!/bin/bash
katalog="/home/irmina"
stringi='BNET\\acct\\lastlogin_time'

for plik in ${katalog}/* ; do cat ${plik} | grep ${stringi}| awk -F'\"' '{print "ostatni_login :", strftime ("%Y-%m-%d  %H:%M:%S", $(NF-1))}'; done
zobacz, czy działa bo nie mam pliku do parsowania i trudno stwierdzić, czu pójdzie..
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
maxblink
Piegowaty Guziec
Piegowaty Guziec
Posty: 27
Rejestracja: 25 cze 2008, 14:39
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME
Kontakt:

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: maxblink »

no no ;)takie blady sie zrobily:

~/skrypty$ sh starylog
starylog: line 5: syntax error near unexpected token `cat'
starylog: line 5: `for plik in ${katalog}/* ; cat $plik | grep ${stringi}| awk -F'\"' '{print "ostatni_login :", strftime ("%Y-%m-%d %H:%M:%S", $(NF-1))}'; ; done'

hmm i czy nie powinienem dopisac:
echo "" > /home/xxx/wyniki1 ;

?
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: leon1313 »

porawiłem, brakowało do.
Poza tym napisz, jakiego narzedzia potrzebujesz, ino kompleksowo, bo teraz to ganianie za kawałkiem marchewki
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: el.pescado »

Można prościej:

Kod: Zaznacz cały

grep -rl "BNET\\auth\\command_groups" katalog
maxblink
Piegowaty Guziec
Piegowaty Guziec
Posty: 27
Rejestracja: 25 cze 2008, 14:39
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME
Kontakt:

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: maxblink »

starylog: line 5: syntax error near unexpected token `;'
starylog: line 5: `for plik in ${katalog}/* ; do cat ${plik} | grep ${stringi}| awk -F'\"' '{print "ostatni_login :", strftime ("%Y-%m-%d %H:%M:%S", $(NF-1))}'; ; done'
:/
Leon, skoro tak bledy wywala to moze poprostu jakos sie da zeby zapisywalo mi do pliku wszystkie nazwy kont ktore byly starsze niz 60 dni [chodzi o date edycji pliku, bo zdaje sie ze to chyba jest rowne tej linijce co podalem]

ps. el.pescado, ja juz druga kwestia, podobna poruszam;], odnosnie last loginu.
Procek
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 lut 2007, 23:30
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: Brak

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: Procek »

hmm ogolnie takiemu last loginowi:
Wed Oct 22 18:42 2008
wg. pliku przypada taki:
"BNET\\acct\\lastlogin_time"="1224693755"
Nie wiem czy to Ci pomoże ale datę postaci sekund od 1 stycznia 1970r czyli np. "1224693755" można zamienić na datę w czytelnym dla człowieka formacie za pomocą polecenia date, np.

Kod: Zaznacz cały

$ date -d'@1224693755'
śro, 22 paź 2008, 18:42:35 CEST

Edit:

Z kolei jeśli chcesz wiedzieć ile to będzie 60 dni temu w sekundach od 1 stycznia 1970r użyj polecenia

Kod: Zaznacz cały

$ date -d'60 days ago' +%s
1219541138
maxblink
Piegowaty Guziec
Piegowaty Guziec
Posty: 27
Rejestracja: 25 cze 2008, 14:39
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME
Kontakt:

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: maxblink »

thmm to jak to w calosc zlepic?

na gorze zapodac
#!/bin/bash
$ date -d'@1224693755' śro, 22 paź 2008, 18:42:35 CEST
$ date -d'60 days ago' +%s 1219541138
echo "" > /home/xxx/wyniki ;
katalog="/home/xxx/pvpgn/var/users" ;

cos na tej zasadzie? [plus ta komenda do przzeszukiwania ?]
Procek
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 lut 2007, 23:30
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: Brak

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: Procek »

Podaj przykładowy plik do sparsowania, będzie nam łatwiej rozwiązać problem.

Mam nadzieję, że ta komenda da oczekiwany efekt, czyli wypisze na ekran nazwy plików, w których data nie będzie starsza niż 2 miesiące:

Kod: Zaznacz cały

gawk -F\" -v minDate=$(date -d'2 months ago' +%s) '( $0 ~ /"BNET\\acct\\lastlogin_time"="[0-9]+"/ && $4 > minDate) {print FILENAME; nextfile}' /home/xxx/pvpgn/var/users/*
Jeśli chcesz zapisać to do pliku dodaj na końcu polecenia takie coś:

Kod: Zaznacz cały

> /home/xxx/wyniki
.

Jeśli natomiast chcesz opakować to wszystko w skrypt to będzie on wyglądać mniej więcej tak:

Kod: Zaznacz cały

#!/bin/bash
dir="/home/xxx/pvpgn/var/users/"
ofile="/home/xxx/wyniki"
minDate=$(date -d'2 months ago' +%s)
gawk -F\" -v minDate=$minDate '( $0 ~ /"BNET\\acct\\lastlogin_time"="[0-9]+"/ && $4 > minDate) {print FILENAME; nextfile}' ${dir}* > $ofile
maxblink
Piegowaty Guziec
Piegowaty Guziec
Posty: 27
Rejestracja: 25 cze 2008, 14:39
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME
Kontakt:

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: maxblink »

to jeszcze raz ;]
sprawa wyglada tak ze:
w katalogu
/home/xxx/pvpgn/var/users - mam pliki textowe, ktorych nazwy odpowiadaja nazwom kont uzytkownikow, w nich mam walsnie ta linijke odnosnie ostatniego logowania. I potrzebuje taki skrypt ktory to by mi wyszukiwal i zapisywal do pliki w:
/home/xxx/wyniki/ w pliki starylog
tylko te nazwy kont na ktore ostatnie logowanie bylo starsze niz 60 dni.

linijka ta w oryginale wyglada tak:
"BNET\\acct\\lastlogin_time"="1224736449"
ta data = Thu OCT 23 06:34 2008

a co do skryptu, tego co podales, to ... niestety nie dziala... tworzy mi ten plik ale jest on pusty.

Kod: Zaznacz cały

#!/bin/bash
dir="/home/xxx/pvpgn/var/users/"
ofile="/home/xxx/wyniki/starylog"
minDate=$(date -d'2 months ago' +%s)
gawk -F\" -v minDate=$minDate '( $0 ~ /"BNET\\acct\\lastlogin_time"="[0-9]+"/ && $4 > minDate) {print FILENAME; nextfile}' ${dir}* > $ofile
sciezki pozmienialem na takie o bo tokladnie chcialem zeby to tak sie orbilo, przyczym ten starylog, ma byc jako plik.txt
Procek
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 lut 2007, 23:30
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: Brak

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: Procek »

Czyli nazwy użytkowników, którzy logowali się w ciągu ostatnich dwóch miesięcy mają się znajdować w pliku: /home/xxx/wyniki/starylog

Zmień w podanym przeze mnie skrypcie trzecią linijkę na:
ofile="/home/xxx/wyniki/starylog"

Oraz upewnij się czy masz zainstalowane gawk, jeśli nie, wywołaj polecenie:

Kod: Zaznacz cały

sudo apt-get insall gawk
Edit: Ok, ścieżki już pozmieniałeś, działa?
maxblink
Piegowaty Guziec
Piegowaty Guziec
Posty: 27
Rejestracja: 25 cze 2008, 14:39
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME
Kontakt:

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: maxblink »

Procek, tak wlasnie mialem.. tworzy sie tylko pusty plik...
a jak sprawdzic czy mam

Kod: Zaznacz cały

gawk
bo z ROOT`a ja wpisuje:

Kod: Zaznacz cały

sudo apt-get insall gawk
to mam ...

Kod: Zaznacz cały

bash: sudo: command not found
Procek
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 lut 2007, 23:30
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: Brak

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: Procek »

Czy masz w ogóle Ubuntu?

A to czy masz gawk możesz sprawdzić wpisując np. polecenie:

Kod: Zaznacz cały

whereis gawk
które powinno dać podobny efekt do tego:

Kod: Zaznacz cały

gawk: /usr/bin/gawk /usr/share/man/man1/gawk.1.gz
Jeśli natomiast napisane jest po prostu gawk: to znaczy, że nie masz.

Jeśli nie wiesz jak zainstalować gawk w swojej dystrybucji spróbuj użyć, w podanym przez mnie skrypcie, polecenia awk (przy czym u mnie zachowanie samego awk było dość dziwne, bo ignorowało polecenie nextfile, dopiero po instalacji gawk, awk zaczęło je interpretować).
maxblink
Piegowaty Guziec
Piegowaty Guziec
Posty: 27
Rejestracja: 25 cze 2008, 14:39
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME
Kontakt:

Odp: [bash] wyszukiwanie za pomoca grep

Post autor: maxblink »

Kod: Zaznacz cały

gawk: /usr/bin/gawk /usr/X11R6/bin/gawk /usr/bin/X11/gawk /usr/share/man/man1/gawk.1.gz
ja ubunta nie mam, mam debiana, ale z tego co czytam sobie ksiazke o UNIX`ie to skrypt i tak powinien dzialac, bynajmiej tak mi sie zdaje;)

ps. free-online.pl/~monastyr/dex4

tu jest przykladowe konto, to plik konta.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości