在处理实际的 grep 输出之前打印出匹配的词
Print out the matched word before the actual grep output is processed
我的意图:搜索源代码并找到感兴趣的关键字。这样做是为了自动执行一小部分代码审查,以发现明显的编程错误,例如硬编码密钥和密码。
我目前有以下 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
,但无法达到我在此处描述的结果。
我还没有测试过这个解决方案,可能会有更好(更优雅)的解决方案,但我会这样做:
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
),而是只搜索匹配行,然后打印 header 并继续使用 sed 打印找到的匹配项的上下文。
我的意图:搜索源代码并找到感兴趣的关键字。这样做是为了自动执行一小部分代码审查,以发现明显的编程错误,例如硬编码密钥和密码。
我目前有以下 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
,但无法达到我在此处描述的结果。
我还没有测试过这个解决方案,可能会有更好(更优雅)的解决方案,但我会这样做:
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
),而是只搜索匹配行,然后打印 header 并继续使用 sed 打印找到的匹配项的上下文。