Szövegkeresés
A Greph szöveges módja soronkénti, bájtalapú keresést végez egy bejárt fában. Ez a greph CLI és a Greph::searchText() homlokzat alapértelmezett módja. A kimenet a kanonikus file:line:content formátumot használja, amelyet a grep, a ripgrep és a legtöbb szerkesztőintegráció fel tud dolgozni.
Gyors példák
# 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
Minták
Alapértelmezés szerint a mintát PCRE2 reguláris kifejezésként értelmezi. A motor működését a PHP preg_* függvényei biztosítják, ezért a szintaxis megfelel a PHP PCRE-referenciának.
Kapcsolja ki a reguláriskifejezés-motort a -F kapcsolóval, hogy a mintát literális bájtsorozatként kezelje. A rögzített karakterláncos mód a gyors út: a strpos() eszközt használja az egyezések kereséséhez, és teljesen kihagyja a PCRE2 fordítási lépését.
A -i mindkét módot kis- és nagybetűkre érzéketlenné teszi. A -w az egyezés két oldalán egészszó-határokat ad meg.
Fájlok szűrése
A Greph végigjárja a fákat keresés előtt. A bejáró közös az AST-móddal és az indexelt móddal, így ugyanazok a szűrőjelzők mindenhol érvényesek.
| Jelző | Hatás |
|---|---|
--type NAME |
Csak a megadott típusálnévnek megfelelő fájlokat veszi fel (php, js, md, ...) |
--type-not NAME |
Kizárja a megadott típusálnévnek megfelelő fájlokat |
--glob GLOB |
Csak a GLOB mintának megfelelő elérési útú fájlokat veszi fel. Többször is megadható. |
--no-ignore |
Figyelmen kívül hagyja a .gitignore és a .grephignore szabályait |
--hidden |
Rejtett fájlokat is felvesz |
A bejáró alapértelmezés szerint figyelembe veszi a .gitignore és a .grephignore beállításait, kihagyja a bináris fájlokat (az első 512 bájtban található nullbájtok alapján felismerve), és 10 MiB-ban korlátozza a fájlméretet. Mindkét korlát a WalkOptions segítségével állítható be.
A beépített típusálnevek teljes listáját lásd a API / FileTypeFilter oldalon.
Kontextus, darabszámok és csak fájlokat felsoroló módok
# 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
A -c, a -l és a -L megkerüli a formázót, így nem kell minden sort memóriába töltenie. Ezek a megfelelő módok a „hány” és „hol” típusú lekérdezésekhez.
Párhuzamos keresések
Adja meg a -j N kapcsolót, hogy a keresés N munkafolyamatra legyen szétosztva. A Greph a pcntl_fork() eszközt használja a munkafolyamat-készlethez, és egyetlen folyamatban történő végrehajtásra vált, ha a ext-pcntl nem érhető el.
./vendor/bin/greph -F -j 8 "function" src
A homlokzat a fájlok száma, az üzemmód és a minta alakja alapján számítja ki, hogy megéri-e a párhuzamos végrehajtás többletterhe. A küszöb alatt egyetlen folyamatot használ. A heurisztikákat lásd a Speciális / Párhuzamos munkafolyamatok oldalon.
JSON kimenet
A --json strukturált adatot bocsát ki, amelyet a további eszközök a grep formátum képernyőről történő kinyerése nélkül is feldolgozhatnak:
./vendor/bin/greph --json -F "function" src
[
{
"file": "src/Greph.php",
"matches": [
{
"line": 31,
"column": 1,
"content": "final class Greph",
"matched_text": "function",
"captures": []
}
]
}
]
A rg burkoló ehelyett ripgrep-esemény alakú JSON adatot bocsát ki. Akkor használja, ha egy meglévő fogyasztó a ripgrep sémát várja.
Programozott használat
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";
}
}
Az eredményobjektumok leírását lásd az API / Eredményobjektumok oldalon.
Működés
A szöveges motornak két útvonala van:
- Literális útvonal: ha be van állítva a
-F, a keresés astrpos()segítségével, egy 64 KiB-os pufferelt olvasón fut, és a sorszámozáshoz nyomon követi az újsorokat. Nincs reguláriskifejezés-fordítási lépés. - Reguláriskifejezés-útvonal: ha nincs beállítva a
-F, a Greph egy kis, PCRE-szerű elemző (Greph\Text\LiteralExtractor) segítségével literális részkarakterláncokat nyer ki a mintából, majd ezeketstrpos()előszűrőként használja. Az előszűrőn átjutó sorokat ezután a JIT-fordítást használó, lefordított PCRE2-mintával veti össze.
Mindkét útvonal ugyanazt a BufferedReader eszközt használja a beolvasáshoz. Az olvasó soronkénti fgets() helyett 64 KiB-os darabokban olvas, ami nagy fájlok esetén jelentősen csökkenti a rendszerhívások számát.
Ismétlődő feladatoknál az indexelt szöveges mód a pufferelt olvasót bemelegített trigram- és azonosító-előfordulásokat tároló tárra cseréli, és teljes egészében kihagyja a fájlok többségét.