Sida 1 av 1

Find (För att leta text inne i filer"

Postat: 14 okt 2008, 13:46
av flierman
Jag kan inte finna ut hur jag ska skriva för att leta ett specifikt ord inne i flera filer.

Om jag skriver:

Kod: Markera allt

find -name *banan*
Så får jag ju fram filer som heter något med "filnamn"

Men jag vill leta upp filer som innehåller ett ord, t,e,x ordet "kalle", det kan vara en massa textfiler som en del av dem har ordet "Kalle" inne i sig.

Hur ska jag då skriva? Kan tusan inte finna ut det via "man find"

Re: Find (För att leta text inne i filer"

Postat: 14 okt 2008, 13:52
av Konservburk
Kommandot du söker heter grep:

Kod: Markera allt

grep -ir kalle .

Re: Find (För att leta text inne i filer"

Postat: 14 okt 2008, 14:03
av flierman
Okej låter prima, jag var inne på grep men var osäker. Om jag som med find-kommandot också vill printa resultatet till en fil så får jag flesvar.

Exempel:

Kod: Markera allt

grep -ir kalle -fprint /home/mike/resultat.txt
Kan man inte använda -fprint ?

Re: Find (För att leta text inne i filer"

Postat: 14 okt 2008, 14:11
av mcNisse
Det är bara att göra en redirect av standardout ;)

Kod: Markera allt

grep -ir kalle . > resultat.txt

Re: Find (För att leta text inne i filer"

Postat: 14 okt 2008, 14:12
av Osprey
Om du bara vill få resultatet till en fil så skriver du:

Kod: Markera allt

grep -ir kalle * > filnamn
Om du både vill få det på skärmen och till en fill så skriver du:

Kod: Markera allt

grep -ir kalle * | tee filnamn
Om du vill lägga till det på slutet i en fil så skriver du:

Kod: Markera allt

grep -ir kalle * >> filnamn
etc.

Re: Find (För att leta text inne i filer"

Postat: 14 okt 2008, 16:21
av flierman
En får tacke..nu ska jag hem och testa

Re: Find (För att leta text inne i filer"

Postat: 24 okt 2008, 08:31
av Ainigma
Men hur gör man om man vill göra en boolesk sökning? T.ex. Jag vill hitta alla de filer (och öppna dem) som innehåller Kalle och Olle men inte Stina ?

Re: Find (För att leta text inne i filer"

Postat: 24 okt 2008, 15:49
av David Andersson
Ainigma skrev:Men hur gör man om man vill göra en boolesk sökning? T.ex. Jag vill hitta alla de filer (och öppna dem) som innehåller Kalle och Olle men inte Stina ?
Enkelt:

Kod: Markera allt

grep -irlZ "Kalle" . | xargs -0 grep -ilZ "Olle" | xargs -0 grep -iL "Stina"
(Om du är säker på att inga filnamn innehåller mellanslag så behövs inte "-Z" och "-0".)

Skillnader mot tidigare kommandon i denna tråd:
  • Punkt "." i st.f stjärna "*": Flaggan "-r" betyder sök rekursivt i underkataloger. Alla filer/kataloger som matchar "*" är också filer/kataloger direkt under ".". (Denna ändring är inte nödvändig, utan min smaksak.)
  • Flaggan "-l": Lista bara filnamn för filer med träffar i, inte text-raden som träffar. Logiken med och/eller/icke ska utföras på filer, inte rader.
  • Flaggan "-L": Lista filnamn för filer det INTE finns några träffar i.
  • Kommandot "xargs": Läs filnamn från stdin och låt dem bli argument till kommandot efter xargs. Exempel: echo brev.txt | xargs ls -l är samma sak som ls -l brev.txt och echo brev.txt .profile | xargs ls -l är samma sak som ls -l brev.txt .profile. (Kuriosa: xargs bryr sig inte om ifall argumenten är filnamn eller nåt annat. Allt på stdin läggs till kommandot som argument.)
  • Flaggan "-Z" på grep och "-0" på xargs: Tillåt mellanslag i filnamn. Normalt listar "grep -l" ett filnamn på varje rad. Med "-Z" separerar den filnamn med ascii NUL. Normalt tycker xargs att mellanslag och nyrad är separator mellan argument i stdin. Med "-0" är bara ascii NUL separator.
Observera att "-r" bara förekommer på första "grep"-kommandot. De andra grep-kommandona får som argument alla de filer de ska söka i.

För att se vad som händer, testa delar av kommandot manuellt på kommandoraden (utan "-Z" för output som ska visas i terminalen):

Kod: Markera allt

grep -irl "Kalle" .
grep -irlZ "Kalle" . | xargs -0 grep -il "Olle" 
(Det går att göra utan "xargs" med "comm" i stället, men berättar inte hur om du inte ber om det.)

EDIT: dubbel negation

Re: Find (För att leta text inne i filer"

Postat: 24 okt 2008, 16:07
av Ainigma
Tack!

Re: Find (För att leta text inne i filer"

Postat: 24 okt 2008, 17:50
av David Andersson
Ainigma skrev:Tack!
Nä, vänta nu. Jag glömde att du skrev "(och öppna dem)". För att öppna filerna i en texteditor, pipa filnamnen från sista grep-satsen till xargs igen. Lägg till "-Z" i sista grep-satsen om du har "-0" i sista xargs-satsen. T.ex

Kod: Markera allt

grep -irlZ "Kalle" . | xargs -0 grep -ilZ "Olle" | xargs -0 grep -iLZ "Stina" | xargs -0 gedit
(Byt ut gedit till din favorit-texteditor)

(Det går att göra utan "xargs" och "comm", med "find" i stället, men berättar inte hur nu.)

Re: Find (För att leta text inne i filer"

Postat: 24 okt 2008, 18:35
av Konservburk
David Andersson skrev:(Det går att göra utan "xargs" och "comm", med "find" i stället, men berättar inte hur nu.)
Med fördelen att man då lätt även kan baka in andra tester som find klarar av, t.ex. filtyp, filstorlek, ägare, senast ändrad, osv.

Kod: Markera allt

find . -exec grep -qi kalle {} \; -a -exec grep -qi olle {} \; -a ! -exec grep -qi stina {} \; -exec nano {} +

Re: Find (För att leta text inne i filer"

Postat: 25 okt 2008, 02:29
av eyerouge
Programmet regexxer kanske vore intressant för dig om du vill slippa CLI:n. Det söker igenom alla/valfria filer efter de uttryck du anger och kan göra ändringar o.s.v.

Re: Find (För att leta text inne i filer"

Postat: 25 okt 2008, 08:34
av Ainigma
Tack för tipset det var mycket värdefullt. Jag har försökt hitta någon motsvarighet till DTsearch och SearchInform för linux men hittills inte hittat något. Jag ska testa Regexxer, kanske kan de motsvara ovannämnda.

Re: Find (För att leta text inne i filer"

Postat: 25 okt 2008, 08:46
av mcNisse
Är du ute efter beagle?

Re: Find (För att leta text inne i filer"

Postat: 25 okt 2008, 12:21
av Ainigma
Näe dessa program är helt inriktade på avancerade sökningar i stora mängder textdokument, inte som Beagle dvs sökning i största allmänhet. :)

Re: Find (För att leta text inne i filer"

Postat: 10 jan 2009, 03:50
av BadOmen
Hej,
jag har just suttit och försökt hitta ett bra sätt att söka efter text i filer och hittade bl.a. denna tråd. Tänkte att jag skulle visa vad jag kom fram till i fall nån skulle ha användning av det.

Eftersom det är en textfil jag vill leta i och jag vet filändelsen, eller nån del i filnamnet, så går det att söka efter det ord jag är ute efter i bara just den sortens filer vilket ju gör att det går betydligt fortare än att söka igenom alla filer.

Kod: Markera allt

find . -name "*.txt" -exec grep -iH "det_du_söker" {} \;
Den första punkten betyder att man utgår från mappen man står i men det kan man byta till nån annan om man vill :)
-H är så att grep skriver ut vilken fil den har hittat det man söker i.
-i gör att det inte det görs nån skillnad på gemener och versaler.

EDIT:
La till -i

Re: Find (För att leta text inne i filer"

Postat: 11 jan 2009, 03:39
av David Andersson
BadOmen skrev:

Kod: Markera allt

find . -name "*.txt" -exec grep -iH "det_du_söker" {} \;
Plus

Byt \; mot + i ovanstående kommando så går det fortare. (Lika fort som med kombinationen find och xargs grep enligt mönster från tidigare inlägg.)

Alias

Det där är väl praktiskt att ha i en alias (eller egentligen en shell-function) i t.ex ~/.profile:

Kod: Markera allt

findgrep () { find . -name "*$1" -exec grep -iH "$2" {} + ; }
så att man bara behöver skriva:

Kod: Markera allt

findgrep .txt "det_du_söker"

Re: Find (För att leta text inne i filer"

Postat: 11 jan 2009, 13:11
av BadOmen
David Andersson skrev:
BadOmen skrev:

Kod: Markera allt

find . -name "*.txt" -exec grep -iH "det_du_söker" {} \;
Plus

Byt \; mot + i ovanstående kommando så går det fortare. (Lika fort som med kombinationen find och xargs grep enligt mönster från tidigare inlägg.)

Alias

Det där är väl praktiskt att ha i en alias (eller egentligen en shell-function) i t.ex ~/.profile:

Kod: Markera allt

findgrep () { find . -name "*$1" -exec grep -iH "$2" {} + ; }
så att man bara behöver skriva:

Kod: Markera allt

findgrep .txt "det_du_söker"
Det där verkar ju riktig smart men jag har ett par frågor.

1. Vad gör det där plustecknet?

2. Hur ska man göra för att få det att fungera med att bara skriva så här?

Kod: Markera allt

findgrep .txt "det_du_söker"
Jag klistrade in din första rad, den med plusset till .profile men det verkade inte vara så enkelt för jag får "bash: findgrep: kommandot finns inte". Vad är det jag har missat att göra? :)

3. Funkar det att göra så här för att utnyttja -maxdepth?

Kod: Markera allt

findgrep () { find . -maxdepth "$1" -name "$2" -exec grep -iH "$3" {} + ; }
och

Kod: Markera allt

findgrep 1 .txt "det_du_söker"
ettan för att bara söka i den mapp man står i.

Jag tog bort * före $2 så får man skriva in den om man vill ha det eller lämna den om man vet vilken fil man vill söka i.