سؤال

وأود أن grep لسلسلة ما، ولكن أيضًا إظهار الأسطر الخمسة السابقة والأسطر الخمسة التالية بالإضافة إلى السطر المطابق.كيف سأكون قادرا على القيام بذلك؟

هل كانت مفيدة؟

المحلول

ل بي إس دي أو جنو grep يمكنك استخدام -B num لتعيين عدد الخطوط قبل المباراة و -A num لعدد الأسطر بعد المباراة.

grep -B 3 -A 2 foo README.txt

إذا كنت تريد نفس عدد الخطوط قبل وبعد يمكنك استخدامها -C num.

grep -C 3 foo README.txt

سيظهر هذا 3 أسطر قبل و 3 أسطر بعد.

نصائح أخرى

-A و -B سوف تعمل، كما سوف -C nn خطوط السياق)، أو فقط -nn خطوط السياق...طالما أن n من 1 إلى 9).

ack يعمل مع حجج مماثلة مثل grep، ويقبل -C.ولكن عادةً ما يكون من الأفضل البحث من خلال التعليمات البرمجية.

grep astring myfile -A 5 -B 5

سيؤدي ذلك إلى grep "myfile" لـ "astring"، وسيظهر 5 أسطر قبل وبعد كل مباراة

أنا عادة استخدام

grep searchstring file -C n # n for number of lines of context up and down

تحتوي العديد من الأدوات مثل grep أيضًا على ملفات man رائعة حقًا.أجد نفسي أشير إلى صفحة رجل grep كثيرًا لأن هناك الكثير الذي يمكنك فعله به.

man grep

تحتوي العديد من أدوات GNU أيضًا على ملحق صفحة المعلومات والتي قد تحتوي على المزيد من المعلومات المفيدة بالإضافة إلى صفحة الدليل.

info grep

ابحث عن "17655" في "/some/file.txt" مع عرض سياق 10 أسطر قبل وبعد (باستخدام Awk)، والإخراج مسبوق برقم السطر متبوعًا بنقطتين.استخدم هذا على Solaris عندما لا يدعم 'grep' خيارات "-[ACB]".

awk '

/17655/ {
        for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
                print before[i]
        }
        print (NR ":" ($0))
        a = 10
}

a-- > 0 {
        print (NR ":" ($0))
}

{
        before[b] = (NR ":" ($0))
        b = (b + 1) % 10
}' /some/file.txt;

استخدم جريب

$ grep --help | grep -i context
Context control:
  -B, --before-context=NUM  print NUM lines of leading context
  -A, --after-context=NUM   print NUM lines of trailing context
  -C, --context=NUM         print NUM lines of output context
  -NUM                      same as --context=NUM

ripgrep

إذا كنت تهتم بالأداء، فاستخدمه ripgrep الذي لديه بناء جملة مماثل ل grep, ، على سبيل المثال.

rg -C5 "pattern" .

-C, --context NUM - عرض NUM من الخطوط قبل وبعد كل مباراة.

هناك أيضًا معلمات مثل -A/--after-context و -B/--before-context.

الأداة مبنية على أعلى محرك Rust's regex مما يجعلها جدا فعال على البيانات الكبيرة.

$grep thestring thefile -5

-5 يحصل على 5 أسطر أعلى وتحت المباراة "thestring" تعادل -c 5 أو -a 5 -b 5

لدى Grep خيار يسمى Context Line Control, ، يمكنك استخدام ال --contect في ذلك، ببساطة،

| grep -C 5

أو

| grep -5

ينبغي أن تفعل الخدعة

هنا هو @ حل يجور في awk

awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile

ملحوظة:يستبدل a و b المتغيرات مع عدد الأسطر قبل وبعد.

إنه مفيد بشكل خاص للنظام الذي لا يدعم grep -A, -B و -C حدود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top