grep: отображать имя файла один раз, затем отображать контекст с номерами строк

Наш исходный код содержит коды ошибок, разбросанные по всему миру. Найти их легко с помощью grep, но мне find_code функция bash find_code которую я могу выполнить (например, find_code #### ), которая будет выдавать выходные данные в следующих строках:

 /home/user/path/to/source.c 85 imagine this is code 86 this is more code 87 { 88 nicely indented 89 errorCode = 1111 90 that's the line that matched! 91 ok this block is ending 92 } 93 } 

Вот что я имею в настоящее время:

 find_code() { # "= " included to avoid matching unrelated number series # SRCDIR is environment variable, parent dir of all of projects FILENAME= grep -r "= ${1}" ${SRCDIR} echo ${FILENAME} grep -A5 -B5 -r "= ${1}" ${SRCDIR} | sed -e 's/.*\.c\[-:]//g' } 

Проблемы:

1) Это не дает номера строк

2) он соответствует только исходным файлам .c. У меня возникли проблемы с получением sed для соответствия файлам .c, .cs, .cpp и другим исходным файлам. Однако мы используем C, поэтому просто сопоставляем – или: (символы, которые grep присоединяет к имени файла перед каждой строкой кода) соответствуют object->pointers и помещают все.

2 Solutions collect form web for “grep: отображать имя файла один раз, затем отображать контекст с номерами строк”

Я бы изменил кое-что.

 find_code() { # assign all arguments (not just the first ${1}) to MATCH # so find_code can be used with multiple arguments: # find_code errorCode # find_code = 1111 # find_code errorCode = 1111 MATCH="$@" # For each file that has a match in it (note I use `-l` to get just the file name # that matches, and not the display of the matching part) Ie we get an output of: # # srcdir/matching_file.c # NOT: # srcdir/matching_file.c: errorCode = 1111 # grep -lr "$MATCH" ${SRCDIR} | while read file do # echo the filename echo ${file} # and grep the match in that file (this time using `-h` to suppress the # display of the filename that actually matched, and `-n` to display the # line numbers) grep -nh -A5 -B5 "$MATCH" "${file}" done } 

Вы можете использовать find с двумя -exec s, второй будет выполняться только в том случае, если первый из них успешный, например, поиск только в файлах .cpp , .c и .cs :

 find_code() { find ${SRCDIR} -type f \ \( -name \*.cpp -o -name \*.c -o -name \*.cs \) \ -exec grep -l "= ${1}" {} \; -exec grep -n -C5 "= ${1}" {} \; } 

поэтому первый grep печатает имена файлов, которые содержат ваш шаблон, а второй печатает соответствующие строки + контекст, пронумерованный, из соответствующих файлов.

  • Используйте команду sed, чтобы проверить, существует ли конкретная строка, если нет, добавьте ее
  • Как мне искать файл для строки, а затем использовать его как переменную?
  • Как напечатать самое длинное число в строке?
  • Как выбрать наивысший элемент числа во многих файлах со многими массивами
  • нужна помощь с awk, объединяющим строки по последовательности из нескольких файлов в один файл
  • Фиксация заголовка и печати
  • Как отредактировать второе появление дубликатов строк?
  • Как получить последние три последние даты файла журнала?
  • Многострочный (в одном абзаце) шаблон заменить использование awk или sed
  • Скользящее среднее в файле журнала с awk или другими утилитами unix?
  • Удаление текста из файла с использованием регулярных выражений
  • Interesting Posts

    Как переустановить Монетный двор Linux? Не заботьтесь о сохранении файлов

    Как начать сеанс удаленной командной строки?

    Исполняемый скрипт не может запускаться непосредственно с рабочего стола в Arch Linux

    Малый CLI-дистрибутив, основанный на Arch или Debian

    Установите Linux на два жестких диска

    Настроить кнопку питания – OpenSUSE LEAP 42.1

    Создание подошвы Bash с фигурными фигурными скобками

    Как проверить, какой пользователь несет ответственность за использование определенного порта?

    rsync через ssh из linux в windows sbs 2003 несоответствие протокола

    распространять продукцию через FIFO

    dh_install: libnanomsg-dev отсутствуют файлы (usr / lib / * / lib * .a), прерывание

    Есть ли какая-либо программа для получения пароля GPG из GUI

    получить исходную дату создания html-файла

    iwlwifi, тогда WLAN работает очень медленно и не может видеть другие WLAN

    Как я могу узнать, связана ли проблема с USB-портами на моем ноутбуке из-за аппаратного или программного обеспечения?

    Linux и Unix - лучшая ОС в мире.