场景
查找cpp文件被哪个动态库编译了。
问题环境:
- 根目录下cmake文件夹下有多个动态库的cmake文件。
cmake文件包含的路径格式可能是srcdeep\srcdeep2:testfile1|testfile3
或者srcdeep\srcdeep2\testfile1
- 待查找的cpp文件在src路径下某个文件目录下,文件路径为相对路径。
思路:
通过cpp文件所在相对路径是否被动态库的config.cmake包含来确定是否被编译。
输入:
cpp文件相对路径
方法:
将相对路径AAA/BBB/CCC拼接为(\bAAA\b).*(\bBBB\b).*(\bCCC\b)的正则表达式,
在通过find、grep、awk命令进行搜索。
输出:
被编译的动态库所属模块名称
代码:
#!/bin/sh
# 填root目录,最后不要有/
rootpath="D:/CompileCheck"
echo "input search file path"
#srcdeep/srcdeep2/testfile1
#src/testfile1
flag="/"
while :; do #循环接受输入
read filepath
if [ -z $filepath ];then #判断用户是否输入
echo "no input"
continue
fi
arg=""
#逐个截取/ /之间的内容填成正则表达式
while [[ $filepath =~ $flag ]]; do
tmp=${filepath%%/*}
# echo "tmp is $tmp"
arg=$arg"(\b"$tmp"\b)".*
filepath=${filepath#*/}
# echo "filepath is $filepath"
done
#正则表达式
arg=$arg"(\b"$filepath"\b)"
# echo "arg is $arg"
#查找名字为config.cmake的文件里面包含filepath的文件,并打印其cmake下的目录
find $rootpath/ -name config.cmake | xargs grep -E "$arg" | awk -F "/" '!a[$4]++{print $4}'
echo "——————————————————————————————————————"
echo "input search file path"
done
文件结构
shell脚本知识
- while循环
while xxx; do
xxx
done
- 判断字符串是否相等
取反判断二进制是否相等
$filepath =~ $flag
- 字符串拼接
arg=$arg"(\b"$tmp"\b)".*
- linux命令行管道
前一个命令的结果作为后一个命令的输入,一种是xargs,一种是exec
find $rootpath/ -name config.cmake | xargs grep -E "$arg"
- grep的正则表达式
正则表达式通用,但要注意转义符号,如果是python可以直接r“正则表达式”(表示不需要使用转义,使用字符字面的意思)正则练习验证网站regex
grep -E "$arg"
- awk分割和去重
-F “分隔符” 按分隔符分割内容。去重使用了数组,定义一个数组a[],元素为$列,当$出现一次后就++,且判断数组的这个元素是不是0,如果出现了至少一次,则数组远程不是0。{print $4}表示前面的表达式满足后则打印第4列的值。这里第4列对应的是cmake的模块目录名。
awk -F "/" '!a[$4]++{print $4}'