04.11.2013, Vladimír Klaus, navštíveno 10887x

Systém

Možná jste někdy potřebovali zjistit počet řádek v textovém souboru nebo počet výskytů nějakého textu v textovém souboru nebo dokonce více souborech.

Pokud spustíte příkazový řádek, resp. vytvoříte dávkový soubor, máte k dispozici řadu zajímavých příkazů, mezi nimiž jsou i FIND a FINDSTR. Především druhý z nich toho umí opravdu hodně, v tomto článku si ale představíme především jeho jednodušší použití.

Kde se vyskytuje hledaný text

Například mě zajímá, na kterých řádcích se vyskytuje text "string". Bude nám k tomu stačit pouhý příkaz FIND, který umí najít v souboru textový řetězec a každou takovou řádku vypíše.

@echo off
FIND "string" DebugUtils.pas
pause

Jak spočítat počet řádek textového souboru v dávce a nejen to

Účel to sice splnilo, ale není to moc přehledné. Co se s tím dá dělat, si ukážeme jedním drobným vylepšením. Pomocí parametru /n se před každou řádkou zobrazí její číslo v rámci textového souboru.

FIND /n "string" DebugUtils.pas

Jak spočítat počet řádek textového souboru v dávce a nejen to

Počet řádek, ve kterých se vyskytuje hledaný text

I toto je velmi jednoduché, vyjdeme z předchozího příkladu. Doplněním parametru /c se zajistí, že bude pouze vypsán počet, nikoliv jednotlivé řádky.

FIND /c "string" DebugUtils.pas

Jak spočítat počet řádek textového souboru v dávce a nejen to

Tady je třeba upozornit, že nejde o celkový počet výskytů daného slova v souboru, ale jen o počet řádek (na řádce může být slovo vícekrát). Zjištění skutečného počtu výskytů je mnohem složitější.

Hledání textu bez ohledu na velikost písmen

Vše výše uvedené se dá vylepšit ještě parametrem /i. Díky němu se při hledání nebude rozlišovat velikost písmen.

FIND /i "string" DebugUtils.pas

FIND /n /i "string" DebugUtils.pas

FIND /c /i "string" DebugUtils.pas

Porovnáním s předchozím obrázkem je zřejmé, že máme v textovém souboru 3x napsán text „string“ jinak než všemi malými písmeny.

Jak spočítat počet řádek textového souboru v dávce a nejen to

Kde se vyskytuje hledaný text, varianta 2

Příkaz FINDSTR je modernější a tedy i dokonalejší. Parametry používané u FIND byly převzaty, až na /c. Příkaz přináší také podporu regulárních výrazů. To je velice mocný prostředek, my ho ale zde využijeme velmi jednoduše. Ale o tom až dále.

FINDSTR /n "string" DebugUtils.pas

Jak spočítat počet řádek textového souboru v dávce a nejen to

Počet řádek textového souboru

Nyní se konečně dostáváme k tomu, o čem má být celý článek. Jak spočítáme počet řádek textového souboru, případně více souborů. Problémem je, že vlastně nehledáme žádný text. Využijeme tedy regulárního výrazu „^“, který značí začátek řádky. Aby se hledaný text chápal jako regulární výraz, musíme přidat parametr /r.

Tímto příkazem tedy vypíšeme všechny řádky, které mají nějaký začátek. No zkrátka všechny řádky… J

FINDSTR /r /n "^" DebugUtils.pas

Jak spočítat počet řádek textového souboru v dávce a nejen to

A teď musíme tento výsledek spočítat a nějak se dopracovat k těm 142. S tím nám zase pomůže obyčejný FIND. Výsledek předáme příkazu FIND pomocí svislítka. Vlastně tím říkáme, že FIND nemá hledat v nějakém souboru, ale v tom, co mu předáme. A protože náš výsledek obsahuje čísla řádků následovaná dvojtečkou, stačí hledat (spočítat) řádky obsahující dvojtečku.

FINDSTR /r /n "^" DebugUtils.pas | FIND /c ":"

Jak spočítat počet řádek textového souboru v dávce a nejen to

Hledat, resp. počítat řádky je možné i ve více souborech.

FINDSTR /r /n "^" *.pas | FIND /c ":"

Nyní se dostáváme k tomu, proč jsem vlastně toto vše potřeboval. Připravoval jsem migraci staršího projektu a bylo třeba projít všechen kód, kde se pracovalo s datumy. Jak tedy najít místa, kterými se budu muset zabývat? Třeba takto:

FINDSTR /r /n "TDate DateToStr StrToDate DateTimeStrEval" *.pas

Jak spočítat počet řádek textového souboru v dávce a nejen to

Pokud totiž hledáte více textů, stačí je oddělit mezerou a příkaz FINDSTR to pochopí. Pokud byste ale naopak chtěli hledat nějaké sousloví, pak se musí přidat parametr /c:.

FINDSTR /r /n /c:"while Y > 0 do" *.pas

Jak spočítat počet řádek textového souboru v dávce a nejen to

Popis příkazů a parametrů

Další informace o možnostech a parametrech příkazů zjistíte pomocí parametru "/?", kdy bude přímo vypsána stručná nápověda.

FIND /?

FINDSTR /?

Jak spočítat počet řádek textového souboru v dávce a nejen to

Pokud vás zajímají další informace a příklady, najdete je v detailním popisu příkazu FIND a FINDSTR na stránkách Microsoftu.

Zajímavost na závěr

Je možné spočítat počet řádek jen za pomocí obyčejného FIND? Ano, možné to je, ale proč tomu tak je, to už si musíte zjistit sami. Není to těžké.

FIND /c /v "" DebugUtils.pas