Portál AbcLinuxu, 30. dubna 2025 14:39
Hledat můžeme lecos a leckde. Následující poznámky jsou určeny těm co se chtějí obejít bez klikacích pomůcek a rychle a efektivně vyhledávat na příkazovém řádku. Nejde o komplexní referenční příručku, spíš jen o několik základních chvatů.
grep
Ačkoliv příkaz grep
lze přímo použít pro vyhledávání v obsahu souborů já osobně jsem se jej nejdříve naučil používat se spojení s příkazem cat
. Ten nedělá nic jiného, než že vypíše obsah souboru na standardní výstup - neboli terminál - a pomocí grep
lze odfiltrovat řádky s požadovaným obsahem. Je-li následující spojení aplikováno na textový soubor s názvem soubor.txt, tak se ve výpisu objeví pouze ty řádky, které obsahují textový řetězec text
cat soubor.txt | grep text
Pokud se chceme obejít bez příkazu cat
, pak by to vypadalo asi takto:
grep 'text' soubor.txt
Užitečný je také přepínač -C počet
, který kromě nalezené řádky zobrazí i okolní řádky a nálezy oddělí pomocí řádky --
. Například
grep -C 2 test soubor.txtvypíše kromě každé řádky obsahující slovo
test
také dvě řádky nad ní a dvě řádky pod ní, což se hodí, protože často nelze z jedné řádky zjistit potřebné informace. A na závěr malé vylepšení, nepříliš známé. Grep totiž umí hledaný řetězec také obarvit. Výchozí barvou je červená, změnit barvu můžeme přes proměnnou GREP_COLOR
grep --color 'text' soubor.txt
Efektivita hledání se projeví naplno při použití regulárních výrazů. Ty můžeme použít jednak při určení souborů které mají být prohledány, ale také při určení hledaného řetězce
grep -E "(první|druhý)" *.txt
Uvedený příklad prohledá všechny soubory (v aktuálním adresáři) s příponou txt a vypíše z nich ty řádky které obsahují bud textový řetětězec "první" nebo "druhý". Pokud bychom chtěli prohledávat pouze některé typy souborů, pak lze použít direktiv --include
a --exclude
. Pro rekurzívní prohledávání vnořených adresářů se použije parametr -r
grep --color -r --include=*.txt linux /usr/local/src
Příkaz uvedený v příkladu tedy prohledá všechny soubory s příponou txt v adresáři /usr/local/src a níže, a bude hledat řetězec "linux" který pak na výstupu obarví.
Občas se stane, že potřebujeme najít nějaký soubor obsahující nám známý kus textu. K tomuto účelu se dá použít mimo bash skripty i samotný grep
. Pokud např. chceme najít všechny soubory obsahující "PATH" v /etc
, můžeme to udělat následovně:
grep -H "PATH" /etc/*
V kombinaci s rekurzívním vyhledáváním ušetří hodně času. Zajímavé jsou také parametry -l
a -L
.
sed
V některých případech můžeme zase s výhodou využít příkazu sed. Například tehdy, chceme-li si vypsat jenom určitou část souboru, vymezenou bud textovým řetězcem, nebo číslem řádku.
sed -n "15266,15269 p" zdroj.txt
Nám vypíše obsah řádků 15266 až 15269. Chybí-li druhá hodnota řádku, nebo je menší než první, tak se vypíše pouze obsah řádku adresovaného první hodnotou. Kromě čísla řádku můžeme adresovat vypisovaný blok textovým řetězcem.
sed -n "/začátek/,/konec/ p" zdroj.txt
Vypíše vše mezi prvním řádkem na kterém se vyskytne řetězec "začátek" a řádkem na kterém se vyskytne řetězec "konec"
Chceme-li hledat nikoliv v obsahu souborů, ale přímo název nějakého souboru či adresáře, pak využijeme příkazu find
.
find
Příkaz find
spuštěný bez parametrů, obvykle začne vypisovat obsah aktuálního odresáře, včetně podadresářů. Tento výpis pak můžeme filtrovat přes grep
podobně, jako bychom vypisovali obsah souboru příkazem cat
find | grep txt
nám vypíše soubory (včetně jejich cesty), které mají v cestě, nebo svém názvu textový řetězec "txt". Pokud nám jde jen o soubory které končí tímto řetězcem, tak za něj přidáme znak "$"
find | grep 'txt$'
Příkaz find
však má sám o sobě velice široké možnosti nastavení vyhledávacích parametrů a není nutné jeho výstupy filtrovat přes grep
. Tak například:
find /home/*/.mozilla/firefox/*.default/ -type f -name "*lock"
Prohledá adresáře s nastavením firefoxu všech uživatelů v adresáři home a zkontroluje zda se v nich vyskytuje soubor který by končil řetězcem "lock". Pokud na takový narazí, tak jej i s cestou vypíše.
Kombinace těchto příkazů dávají v shellu netušené možnosti, jaké žádný klikací nástroj nemá (a ani nemůže mít). Pro další studium odkazuji na manuálové stránky.
Dokument vytvořil: Aleš Kapica, 16.5.2006 16:19 | Poslední úprava: Jiří J., 7.9.2007 14:53 | Další přispěvatelé: MiK, regnarg | Historie změn | Zobrazeno: 34325×
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.