أداة مميزة للبحث في الملفات النصية ذات المسافة البادئة.
مستوحاة من ogrep لمات بروبيك. هذا الغول صغير الحجم وجميل، ولكنه ليس مميزًا.
راجع أيضًا ogrep — منفذ هذه الأداة المكتوب بلغة Python (في الحقيقة، لقد كان الأول).
يشبه ogrep
إلى حد كبير grep
، حيث يمكن لكل منهما البحث عن التطابقات وعرض السياق الخاص بها. لكن السياق في grep
هو "أسطر N قبل/بعد المطابقة"، وفي ogrep
هو "أسطر أعلى مطابقة مع مسافة بادئة أقل".
اسمحوا لي أن أشرح. أستخدم هذه الأداة غالبًا عند العمل مع ملفات بناء GN، لذا سأستخدم بعض ملفات BUILD.gn الكبيرة كمثال. المهمة المعتادة هي البحث عن اسم الملف المصدر وفهم الهدف الذي يتضمن هذا الملف وتحت أي ظروف.
لنبحث عن الإشارات إلى ملف "arena.cc":
# grep arena.cc BUILD.gn
"base/arena.cc",
حسنًا، الآن بعد أن أصبح ملفنا موجودًا، لكننا لا نعرف الهدف. دعونا نسأل عن بعض السياق:
# grep -C2 arena.cc BUILD.gn
"base/address_tracker_linux.cc",
"base/address_tracker_linux.h",
"base/arena.cc",
"base/arena.h",
"base/backoff_entry.cc",
لا، ليس ذلك مفيداً. دعونا نحاول ogrep
:
ogrep arena.cc BUILD.gn
102: component("net") {
385: if (!is_nacl) {
386: sources += [
409: "base/arena.cc",
الآن هذا مفيد! نعلم على الفور أن هذا الملف تم تضمينه في الهدف "net" ضمن شرط "!is_nacl".
بل إنه أفضل، لأن ogrep
يمكنه استخدام الألوان، وهذه صورة:
قم بتثبيت Rust and Cargo، إذا لم تكن قد قمت بذلك بعد
cargo install ogrep
قم بتثبيت Homebrew، ثم
brew install kriomant/ogrep-rs/ogrep-rs
آسف، ليس بعد، ولكنني أعمل على ذلك. استخدم البضائع في الوقت الراهن.
هناك الكثير من الخيارات المتاحة، يمكنك تشغيلها باستخدام --help
لإدراجها.
الأداة مفيدة ليس فقط للملفات الصارمة المستندة إلى مسافة بادئة (مثل مصدر Python) أو ملفات إنشاء GN، ولكن لمجموعة واسعة من الملفات النصية، لأنه حتى الملفات التي لا تعتمد على مسافة بادئة يتم تنسيقها عادةً من أجل الراحة.
حتى أن هناك بعض الاختراقات المضمنة المتعلقة بـ C.
فيما يلي قائمة مختصرة بالميزات:
النمط هو نص ثابت بشكل افتراضي، ولكن يمكنك استخدام تعبير عادي عشوائي مع -e
.
المعتاد -w
(مطابقة الكلمات بأكملها) و -i
(بحث غير حساس لحالة الأحرف) متاحان.
تحافظ الأداة على بعض الأسطر الفارغة بين التطابقات، لأنها تساعد على فصل مجموعات التطابقات ذات الصلة بشكل مرئي، ويمكنك إيقاف تشغيلها باستخدام --no-breaks
.
في بعض الأحيان يكون من المفيد معرفة ما إذا كانت هناك خطوط أخرى بين الخطوط المتطابقة. استخدم --ellipsis
لذلك.
إذا قمت بدمج otool
مع أدوات خارجية، فقد تكون خيارات --print-filename
مفيدة، حيث تخبرك بطباعة اسم الملف في حالة العثور على أي تطابق.
بشكل افتراضي، تتم معاملة فروع "if-else" بشكل خاص: يتم الاحتفاظ بفروع if حتى تعرف الشروط حتى عند العثور على تطابق في فرع "else":
السياق التقليدي (عرض N بادئة و/أو خطوط لاحقة حول الخط المطابق) مدعوم أيضًا بخيارات --context/-C
و --before-context/-B
و --after-context/-A
.
# ./ogrep filename_util_icu BUILD.gn
102: component("net") {
2106: if (!is_nacl) {
2210: if (use_platform_icu_alternatives) {
2222: } else {
2228: sources += [
2229: "base/filename_util_icu.cc",
يمكن إيقاف هذا باستخدام --no-smart-branches
.
--no-ignore-preprocessor
.تم التخطيط للتعامل بشكل أكثر ذكاءً مع تعليمات المعالج المسبق (السياق الموازي).
otool
مخصص للبحث في ملف واحد فقط. كما أنه ليس سريعًا جدًا ليتم استخدامه للبحث في العديد من الملفات. ولكن يمكنك دمجها مع أدوات البحث الأخرى مثل هذا:
grep -l cache_used -r . --include='*.cc' | xargs -n1 ogrep --print-filename cache_used
git grep
المدمج يحتوي ogrep
على تكامل مدمج مع git grep
: عندما يتم إعطاء خيار -g
، يتم تمرير الوسيطة الثانية إلى git grep
كمواصفات المسار. يتم أيضًا تمرير جميع الخيارات ذات الصلة ( -w
و -i
وما إلى ذلك) إلى git grep
تلقائيًا، ويتم فرض --print-filename
.
ogrep -g cache_used '*.cc'