
Есть ли способ вывести соседние строки вместе с номерами строк при grep-анализе содержимого файла? Я пытаюсь получить выходные данные в форме:
$ ~/myscript.sh download file # 'download' being the pattern here
121: # and downloads with wget/curl, whichever is available.
122: download_file () {
123: if which wget &>/dev/null; then
----------
356: # Since the prerequisites are already installed, we may proceed
357: download_urls=("http://example.com/foo/bar.bz2"
358: "http://d1.example.com/xyz/abc.tar.gz"
Конечно, я знаю, что могу получить grep моего шаблона с опцией -n
и показать некоторые соседние строки из полученного номера строки (например, используя любой из методовздесь), но есть ли лучший способ сделать это?
решение1
Вы можете использовать GNU grep
Context Line Control, отсюда man grep
:
-A NUM, --after-context=NUM
Вывести NUM строк конечного контекста после совпадающих строк. Размещает строку, содержащую разделитель групп (--), между смежными группами совпадений. С опцией -o или --only-matching это не имеет никакого эффекта и выдается предупреждение.
-B NUM, --before-context=NUM
Вывести NUM строк начального контекста перед совпадающими строками. Размещает строку, содержащую разделитель групп (--), между смежными группами совпадений. С опцией -o или --only-matching это не имеет никакого эффекта и выдается предупреждение.
Если вам требуется одинаковое количество строк с каждой стороны, вы можете использовать один номер контекста:
-C NUM, -NUM, --context=NUM
Вывести NUM строк выходного контекста. Размещает строку, содержащую разделитель групп (--), между смежными группами совпадений. С опцией -o или --only-matching это не имеет никакого эффекта и выдается предупреждение.
В сочетании с -n
флагом ( --line-number
) вы получаете пронумерованные совпадения с окружающим контекстом.
В вашем примере:
grep -n -C1 download