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

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
flierman
Inlägg: 240
Blev medlem: 12 aug 2007, 22:18
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Östersund, Sweden

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

Inlägg 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"
Senast redigerad av 1 flierman, redigerad totalt 21 gånger.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

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

Inlägg av Konservburk »

Kommandot du söker heter grep:

Kod: Markera allt

grep -ir kalle .
Användarvisningsbild
flierman
Inlägg: 240
Blev medlem: 12 aug 2007, 22:18
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Östersund, Sweden

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

Inlägg 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 ?
Användarvisningsbild
mcNisse
Inlägg: 5211
Blev medlem: 06 feb 2007, 20:51
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

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

Inlägg av mcNisse »

Det är bara att göra en redirect av standardout ;)

Kod: Markera allt

grep -ir kalle . > resultat.txt
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

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

Inlägg 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.
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
flierman
Inlägg: 240
Blev medlem: 12 aug 2007, 22:18
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Östersund, Sweden

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

Inlägg av flierman »

En får tacke..nu ska jag hem och testa
Ainigma
Inlägg: 803
Blev medlem: 26 sep 2007, 20:49
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

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

Inlägg 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 ?
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

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

Inlägg 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
Ainigma
Inlägg: 803
Blev medlem: 26 sep 2007, 20:49
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

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

Inlägg av Ainigma »

Tack!
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

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

Inlägg 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.)
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

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

Inlägg 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 {} +
eyerouge
Inlägg: 787
Blev medlem: 18 jun 2007, 03:44
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS
Ort: malmö
Kontakt:

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

Inlägg 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.
Bild
Ainigma
Inlägg: 803
Blev medlem: 26 sep 2007, 20:49
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

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

Inlägg 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.
Användarvisningsbild
mcNisse
Inlägg: 5211
Blev medlem: 06 feb 2007, 20:51
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

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

Inlägg av mcNisse »

Är du ute efter beagle?
Ainigma
Inlägg: 803
Blev medlem: 26 sep 2007, 20:49
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

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

Inlägg 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. :)
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

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

Inlägg 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
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

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

Inlägg 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"
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

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

Inlägg 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.
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
Skriv svar

Återgå till "Terminalforum"