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 и помещают все.

  • Передача обычных файлов только на `sed -i`
  • Замена строки во всех файлах, найденных grep. Не могу заставить его работать
  • sed многострочная рекурсивная подстановка шаблона
  • Частота слов в тексте на неанглийском языке: как я могу объединить единичные и множественные формы и т. Д.?
  • Сопоставьте целое слово (IP-адрес) с помощью `sed`
  • (Mac Terminal) sed для анализа JSON ... что я делаю неправильно?
  • подсчеты совпадений и несоответствий
  • Заменить пробелы командой sed и regexp, не работающими
  • 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 печатает имена файлов, которые содержат ваш шаблон, а второй печатает соответствующие строки + контекст, пронумерованный, из соответствующих файлов.

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