Pāriet uz saturu

Teksta meklēšana

Greph teksta režīms ir pa rindām veikta baitu meklēšana apstaigātā failu kokā. Tas ir noklusējuma režīms saskarnei greph CLI un fasādei Greph::searchText(). Izvade izmanto kanonisko file:line:content formātu, ko parsē grep, ripgrep un vairums redaktoru integrāciju.

Īsi piemēri

Apvalks
# Regex search across the current directory
./vendor/bin/greph "function\s+\w+"

# Fixed-string search across src/
./vendor/bin/greph -F "function" src

# Case-insensitive whole-word search
./vendor/bin/greph -F -i -w "function" src

# Two lines of context around each match
./vendor/bin/greph -F -C 2 "TODO" src

# Stop after the first three matches per file
./vendor/bin/greph -F -m 3 "TODO" src

# Files that contain the pattern
./vendor/bin/greph -F -l "TODO" src

# Files that do not contain the pattern
./vendor/bin/greph -F -L "TODO" src

# Count matches per file
./vendor/bin/greph -F -c "TODO" src

# Inverted match
./vendor/bin/greph -F -v "TODO" src/notes.txt

Raksti

Pēc noklusējuma raksts tiek interpretēts kā PCRE2 regulārā izteiksme. PHP preg_* funkcijas nodrošina dzinēja darbību, tāpēc sintakse atbilst PCREPHP atsaucei.

Izslēdziet regulāro izteiksmju dzinēju ar -F, lai rakstu uztvertu kā burtisku baitu secību. Precīzas virknes režīms ir ātrākais ceļš: tas salīdzināšanai izmanto strpos() un pilnībā izlaiž PCRE2 kompilēšanas soli.

-i padara abus režīmus reģistrjutības neņemošus. -w pievieno pilna vārda robežas abās atbilstības pusēs.

Failu filtrēšana

Greph pirms meklēšanas apstaigā failu koku. Apstaigātājs tiek koplietots ar AST režīmu un indeksēto režīmu, tāpēc visur darbojas tie paši filtrēšanas karodziņi.

Karodziņš Iedarbība
--type NAME Iekļaut tikai failus, kas atbilst nosauktajam tipa aizstājvārdam (php, js, md, ...)
--type-not NAME Izslēgt failus, kas atbilst nosauktajam tipa aizstājvārdam
--glob GLOB Iekļaut tikai failus, kuru ceļi atbilst GLOB. Var norādīt atkārtoti.
--no-ignore Neņemt vērā .gitignore vai .grephignore
--hidden Iekļaut slēptos failus

Apstaigātājs pēc noklusējuma ievēro .gitignore un .grephignore, izlaiž bināros failus (tos nosaka pēc nulles baitiem pirmajos 512 baitos) un ierobežo faila lielumu līdz 10 MiB. Abus ierobežojumus var konfigurēt ar WalkOptions.

Pilnu iebūvēto tipu aizstājvārdu sarakstu skatiet sadaļā API / FileTypeFilter.

Konteksts, skaits un tikai failu režīmi

Apvalks
# Two lines before and after each match
./vendor/bin/greph -F -C 2 "needle" src

# Two lines after, no lines before
./vendor/bin/greph -F -A 2 "needle" src

# Two lines before, no lines after
./vendor/bin/greph -F -B 2 "needle" src

# Count matches per file
./vendor/bin/greph -F -c "needle" src

# List matching files only
./vendor/bin/greph -F -l "needle" src

# List non-matching files only
./vendor/bin/greph -F -L "needle" src

-c, -l un -L apiet formatētāju, lai nebūtu jāizveido visas rindas. Šie režīmi ir piemēroti vaicājumiem “cik” un “kur”.

Paralēla skenēšana

Norādiet -j N, lai sadalītu skenēšanu starp N darbplūsmām. Greph darbplūsmu kopai izmanto pcntl_fork() un pārslēdzas uz viena procesa izpildi, ja ext-pcntl nav pieejams.

Apvalks
./vendor/bin/greph -F -j 8 "function" src

Fasāde pēc failu skaita, režīma un raksta formas aprēķina, vai paralēlā izpilde ir tā vērta. Ja slieksnis nav sasniegts, tā paliek viena procesa režīmā. Heiristiku aprakstu skatiet sadaļā Advanced / Parallel Workers.

JSON izvade

--json izvada strukturētu datu kopu, ko pakārtotie rīki var parsēt, neparsējot grep formātu no ekrāna:

Apvalks
./vendor/bin/greph --json -F "function" src
JSON
[
  {
    "file": "src/Greph.php",
    "matches": [
      {
        "line": 31,
        "column": 1,
        "content": "final class Greph",
        "matched_text": "function",
        "captures": []
      }
    ]
  }
]

rg aplauzējs tā vietā izvada ripgrep notikumu formas JSON. Izmantojiet to, ja esošais patērētājs sagaida ripgrep shēmu.

Izmantošana programmā

PHP
use Greph\Greph;
use Greph\Text\TextSearchOptions;

$results = Greph::searchText(
    'function',
    'src',
    new TextSearchOptions(
        fixedString: true,
        caseInsensitive: true,
        beforeContext: 1,
        afterContext: 1,
        jobs: 4,
    ),
);

foreach ($results as $file) {
    foreach ($file->matches as $match) {
        echo "{$file->file}:{$match->line}:{$match->content}\n";
    }
}

Rezultātu objekti ir aprakstīti sadaļā API / Result objects.

Kā tas darbojas

Teksta dzinējam ir divi ceļi:

  • Burtiskais ceļš: ja iestatīts -F, meklēšana tiek veikta ar strpos(), izmantojot 64 KiB buferētu lasītāju, kas seko jaunajām rindām, lai noteiktu rindu numurus. Regulārā izteiksme netiek kompilēta.
  • Regulāro izteiksmju ceļš: ja -F nav iestatīts, Greph ar nelielu PCRE tipa analizatoru (Greph\Text\LiteralExtractor) izvelk no raksta burtiskās apakšvirknes un izmanto tās kā strpos() priekšfiltru. Rindas, kas iztur priekšfiltru, pēc tam tiek salīdzinātas ar kompilēto PCRE2 rakstu, kurā iespējots JIT.

Abos ceļos I/O vajadzībām tiek izmantots viens un tas pats BufferedReader. Lasītājs nolasa datus 64 KiB blokos, nevis fgets() katrai rindai, tādējādi ievērojami samazinot sistēmas izsaukumu skaitu lielos failos.

Atkārtotām slodzēm indeksētais teksta režīms buferēto lasītāju aizstāj ar iesildītu triagrammu un identifikatoru ierakstu krātuvi un pilnībā izlaiž lielāko daļu failu.