Strona 1 z 2
[bash] wyszukiwanie za pomoca grep
: 22 paź 2008, 18:49
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?
Odp: [bash] wyszukiwanie za pomoca grep
: 22 paź 2008, 19:09
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
Odp: [bash] wyszukiwanie za pomoca grep
: 22 paź 2008, 19:17
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
Odp: [bash] wyszukiwanie za pomoca grep
: 22 paź 2008, 19:21
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
Odp: [bash] wyszukiwanie za pomoca grep
: 22 paź 2008, 19:35
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?
Odp: [bash] wyszukiwanie za pomoca grep
: 22 paź 2008, 20:05
autor: leon1313
to zależy jaka formę przyjmuje ta data..
Odp: [bash] wyszukiwanie za pomoca grep
: 22 paź 2008, 20:13
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?
Odp: [bash] wyszukiwanie za pomoca grep
: 22 paź 2008, 20:58
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..
Odp: [bash] wyszukiwanie za pomoca grep
: 22 paź 2008, 21:41
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 ;
?
Odp: [bash] wyszukiwanie za pomoca grep
: 22 paź 2008, 21:43
autor: leon1313
porawiłem, brakowało do.
Poza tym napisz, jakiego narzedzia potrzebujesz, ino kompleksowo, bo teraz to ganianie za kawałkiem marchewki
Odp: [bash] wyszukiwanie za pomoca grep
: 22 paź 2008, 21:47
autor: el.pescado
Można prościej:
Kod: Zaznacz cały
grep -rl "BNET\\auth\\command_groups" katalog
Odp: [bash] wyszukiwanie za pomoca grep
: 22 paź 2008, 21:53
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.
Odp: [bash] wyszukiwanie za pomoca grep
: 23 paź 2008, 03:21
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
Odp: [bash] wyszukiwanie za pomoca grep
: 23 paź 2008, 06:41
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 ?]
Odp: [bash] wyszukiwanie za pomoca grep
: 23 paź 2008, 14:10
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ś:
.
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
Odp: [bash] wyszukiwanie za pomoca grep
: 23 paź 2008, 15:57
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
Odp: [bash] wyszukiwanie za pomoca grep
: 23 paź 2008, 16:08
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:
Edit: Ok, ścieżki już pozmieniałeś, działa?
Odp: [bash] wyszukiwanie za pomoca grep
: 23 paź 2008, 16:28
autor: maxblink
Procek, tak wlasnie mialem.. tworzy sie tylko pusty plik...
a jak sprawdzic czy mam
bo z ROOT`a ja wpisuje:
to mam ...
Odp: [bash] wyszukiwanie za pomoca grep
: 23 paź 2008, 16:38
autor: Procek
Czy masz w ogóle Ubuntu?
A to czy masz gawk możesz sprawdzić wpisując np. polecenie:
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ć).
Odp: [bash] wyszukiwanie za pomoca grep
: 23 paź 2008, 16:41
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.