grep: dosya adını bir kez görüntüle, ardından satır numaralarıyla bağlamı göster


16

Kaynak kodumuzda hata kodları dağılmıştır. Bunları bulmak grep ile kolaydır, ancak bu satırlar boyunca çıktı sağlayacak olan find_code(örneğin find_code ####) çalıştırabileceğim bir bash işlevi istiyorum :

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

İşte şu anda ne var:

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

sorunlar:

1) Bu satır numaraları sağlamaz

2) yalnızca .c kaynak dosyalarıyla eşleşir. .C, .cs, .cpp ve diğer kaynak dosyaları eşleştirmek için sed alma konusunda sorun yaşıyorum. Yine de C'yi kullanıyoruz, bu yüzden sadece eşleştirme - veya: ( object->pointersgrep'in her kod satırından önce dosya adına eklediği karakterler) her şeyi eşleştirir ve dağıtır.

Yanıtlar:


11

İle ilgili birkaç şeyi değiştirirdim.

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) I.e 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 
}

Bunu özelliklerime göre yeniden ayarladım - sadece hata kodlarını aramak istiyorum. Yani MATCH="= ${1}". --include=*.c --include=*.cpp --include=*.java --include=*.csAramayı kaynak dosyalarla sınırlandırmak için de ekledim . Teşekkürler!
TravisThomas

1
İyi oh, iyi ihtiyaçlarınıza göre ayarlanmış sevindim :)
Drav Sloan

3

Sen kullanabilirsiniz findiki ile -execilki sadece arama örneğin başarılı olması halinde ikinci bir çalıştırılacaktır, s .cpp, .cve .csdosyaları:

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

böylece ilki grepdeseninizi içeren dosya adlarını yazdırır ve ikincisi ilgili dosyalardan numaralandırılmış eşleşen satırları + bağlamı yazdırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.