lördag 10 januari 2009

Sök text i en fil från terminalen

Här är kommandot jag använder för att hitta text i filer.
find . -iname '*.txt' -exec grep -Hi 'hej på dig' {} + ;

Om man vill bestämma hur många nivåer ner i katalogträdet man vill göra sökningen så kan man göra så här:

find . -maxdepth 1 -iname '*.txt' -exec grep -Hi 'hej på dig' {} + ;

-maxdepth 1 gör så att det bara söks i den mapp man står i och int i undermapparna.
-maxdepth 2 gör alltså så det söks i den map man står i och en nivå under.
. Gör att sökningen utgår från den mapp man står i, alternativ sökväg kan anges.
-iname gör att den inte bryr sig om stora eller små bokstäver
'*.txt* kan bytas ut mot det som passar ens behov bäst. Detta matchar alla filer som slutar på .txt.
-exec grep gör att de filer som i detta fall .txt filer skickas vidare till grep.
- grep söker i filerna efter hej på dig.
- H gör så att sökvägen till filen skrivs ut.
-i gör så att det inte görs nån skillnad på gemener och VERSALER i sökningen.

Det spelar ingen roll om man skriver -i - H eller -iH men jag tyckte det var lättare att komma ihåg när det står Hi =) Det är dock viktigt med att använda ett stort H och ett litet i annars blir det ett annat kommando :)

Skriv man find i terminal för att komma åt manualen eller skriv info find för en mer utförlig information, klicka er nån undermeny med Enter.


TIPS:

Kopiera in följande längst ned i filen ~/.bashrc

# Den här söker rätt på text inuti filer. Användning: findtxt n "filtyp_eller_namndel" "text du söker efter" n är optional och anger hur djupt ner i kattalogträdet du vill söka. ex. findtxt "*.txt" "Hej Jonas" alt. findtxt 5 "*.txt" "Hej Jonas"

findtxt ()

{

if [ -z "$1" ] ; then # Kollar om det helt och hållet saknas argument

echo "Tips: findtxt \"*.txt\" \"sökord\" Alt. findtxt n \"*.txt\" \"sökord\" n är hur djupt ner i katalogträdet man vill söka (optional)"

elif [ -z "$2" ] ; then # Kollar om det andra argumentet har angivits.

echo "Du måste också ange vilken text du söker efter tex. \"Hej Jonas\""

elif [ -z "$3" ] ; then # Kollar om det tredje argumentet har angivits annars körs det utan nåt maxdepth har sats på sökningen.

find . -iname "${1}" -exec grep -Hi "${2}" {} +;

else # Minst tre argument har angivits, utgår från att det är: maxdepth, filen och sökordet. Om det skulle vara fler eller felaktiga argument så tar grund kommandot find eller grep hand om det, hoppas jag :P

find . -maxdepth "${1}" -iname "${2}" -exec grep -Hi "${3}" {} +;
fi
}

Spara och öppna en ny terminal och skriv följande för att göra en sökning:
findtxt "*.txt" "det du söker efter" Alt. findtxt n "*.txt" "det du söker efter" där n står för hur djupt ner i katalogträdet du vill söka. Skriv bara findtxt för info.
Om du vill söka i nån annan typ av fil så är det bara byta ut *.txt mot valfri.
Denna söker bara i den mapp du står i och underkatalogerna .

Inga kommentarer: