grep ملف، ولكن تظهر عدة خطوط المحيطة؟
-
08-06-2019 - |
سؤال
وأود أن 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 n
(ل n
خطوط السياق)، أو فقط -n
(ل n
خطوط السياق...طالما أن 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
حدود.