如何将grep匹配的类实例结果按类名分组统计为PHP数组
按类名分组统计前端组件中CSS类的使用次数(PHP+Shell实现)
问题场景
在PHP中通过exec调用grep命令统计前端组件文件里指定CSS类的使用次数,当前执行的命令为:
\exec("grep -orE '" . $classesBarred . "' ../../front/src/components | sort | uniq -c", $allClassesCount);
其中$classesBarred是多类名匹配串(如search-unfocused|bg-app|enlarged-window),但返回结果包含文件路径,无法直接按类名分组,需要转换成[{search-unfocused:90}, {bg-app:45}]这类格式的数组。
优化后的Shell命令
借助awk简化处理流程,直接提取类名并统计,命令如下:
grep -orE "$classesBarred" ../../front/src/components | awk -F: '{print $NF}' | sort | uniq -c | awk '{print $2 "::" $1}'
命令各部分作用:
grep -orE "$classesBarred" ../../front/src/components:递归搜索目标目录,输出文件路径:类名格式的匹配结果awk -F: '{print $NF}':以冒号为分隔符,提取每行最后一段(即类名)sort | uniq -c:对类名排序后去重,统计每个类名的出现次数awk '{print $2 "::" $1}':将统计结果转为类名::次数的格式,方便PHP解析
PHP解析并生成目标数组
将Shell命令的输出读取后,解析成需求格式的数组:
$classesBarred = 'search-unfocused|bg-app|enlarged-window'; // 拼接Shell命令,注意转义$符号 $cmd = "grep -orE '$classesBarred' ../../front/src/components | awk -F: '{print \$NF}' | sort | uniq -c | awk '{print \$2 \"::\" \$1}'"; exec($cmd, $output); $result = []; foreach ($output as $line) { list($className, $count) = explode('::', $line); $result[] = [trim($className) => (int)trim($count)]; } // 如需JSON格式,直接编码即可 echo json_encode($result);
执行后会得到类似[{"search-unfocused":90},{"bg-app":45},{"enlarged-window":23}]的结果,完全符合需求。
内容的提问来源于stack exchange,提问作者Magor Menessy
相关产品推荐
相关产品推荐

