grep: afficher le nom du file une seule fois, puis afficher le context avec les numéros de ligne

Notre code source a des codes d'erreur dispersés partout. Les find est facile avec grep, mais je voudrais une fonction bash find_code que je peux exécuter (par exemple find_code #### ) qui fournira la sortie le long de ces lignes:

 /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 } 

Voici ce que j'ai actuellement:

 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' } 

Problèmes:

1) Cela ne fournit pas de numéros de ligne

2) il ne correspond qu'aux files source .c. J'ai du mal à get sed pour faire correspondre les files .c, .cs, .cpp et d'autres sources. Nous utilisons C, cependant, en faisant simplement correspondre – ou: (les caractères que grep ajoute au nom de file avant chaque ligne de code) correspond à object->pointers et tout gâcher.

Je voudrais changer quelques choses à propos de.

 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 } 

Vous pouvez utiliser find avec deux -exec , le second ne sera exécuté que si le premier est réussi, par exemple en ne recherchant que les files .cpp , .c et .cs :

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

donc le premier grep affiche les noms de files qui contiennent votre model et le second imprime les lignes correspondantes + le context, numéroté, des files respectifs.