Распечатайте соответствующее слово перед обработкой фактического вывода grep
Мое намерение: поиск через исходный код и найти ключевые слова, представляющие интерес. Это сделано для того, чтобы автоматизировать небольшую часть просмотра кода, чтобы найти очевидные ошибки программирования, такие как жестко закодированные ключи и пароли.
В настоящее время у меня есть следующая команда grep для поиска кода по определенным словам:
while read p; do
echo "FOUND: ${p}"
grep -riIn -A 5 -B 5 ${p} "${SEARCHPATH}"
done < "${SEARCHWORDS}"
SEARCHWORDS
на самом деле это местоположение файла со списком, содержащим поисковые слова.SEARCHPATH
это папка, в которой должен искать grep. Вывод, который он генерирует, следующий:
xo.java-33- default:
xo.java-34- return str;
xo.java-35- case -4501:
xo.java-36- return "Internal error";
xo.java-37- case -4502:
xo.java:38: return "Activation password too long. Limited to 512 characters.";
xo.java-39- case -4503:
xo.java-40- return "CHS key null or empty. Must be a 32 hexadecimal string.";
xo.java-41- case -4504:
xo.java-42- return "Incorrect CHS key length. Must be a 32 hexadecimal string.";
xo.java-43- case -4505:
Как вы можете видеть, он также дает строки выше и ниже, чтобы дать мне некоторый контекст и посмотреть, является ли это ложным срабатыванием. Но я хотел бы получить следующий вывод:
Found "password" in file "xo.java":
xo.java-33- default:
xo.java-34- return str;
xo.java-35- case -4501:
xo.java-36- return "Internal error";
xo.java-37- case -4502:
xo.java:38: return "Activation password too long. Limited to 512 characters.";
xo.java-39- case -4503:
xo.java-40- return "CHS key null or empty. Must be a 32 hexadecimal string.";
xo.java-41- case -4504:
xo.java-42- return "Incorrect CHS key length. Must be a 32 hexadecimal string.";
xo.java-43- case -4505:
Я хочу найти найденное поисковое слово поверх него, чтобы все экземпляры были сгруппированы вместе с их найденным ключевым словом.
Если у вас есть предложения по другим инструментам, не стесняйтесь поделиться ими. Я попробовал команду ack
, но я не смог достичь результата, как я опишу здесь.
1 ответ
Я еще не тестировал это решение, и было бы лучшее (более элегантное) решение, но я бы сделал следующее:
while read p
do
# For each found result, do...
grep -riIn ${p} "${SEARCHPATH} | while read -r line ; do
# Split array on ':' into an array
# element 0 is relative path to file
# element 1 is line number of match
IFS=':' read -r -a array <<< "${line}"
# Print your header
echo "FOUND '${p}' in '${array[0]}' on line ${array[1]}"
echo -e "\n"
# Calculate ranges (number of lines before and after match)
from_line_nr=$((${array[1]}-5))
to_line_nr=$((${array[1]}+5))
# limit ranges if the result is not a valid line number
# sed can handle numbers bigger than the number of lines in the file
# so we only need to make sure our lower limit equals to
if [ "${from_line_nr}" -lt "1" ]; then from_line_nr=1; fi
# show lines before and after match using sed
sed -n "${from_line_nr},${to_line_nr}p" "${array[0]}"
# Add some white lines to improve readability
echo -e "\n\n"
done
done < "${SEARCHWORDS}"
Вместо использования параметров -A
а также -B
(или же -C
Короче говоря, я grep только для строки соответствия, затем я печатаю заголовок, который вы хотите, и продолжаю печатать контекст найденного соответствия, используя sed.