一、需求
有一系列csv文件,例如:
/home/ubantu/prod_master/Masters/250901120142_12041_001.csv
/home/ubantu/prod_master/Masters/250901120142_12041_002.csv
/home/ubantu/prod_master/Masters/250901120142_12041_003.csv
...
其中csv每行都是一个商品信息。
有一系列商品id,例如:
372522705401
372532703601
...
现在要查询,这些商品id是否在csv文件中存在;
如果不存在,统计出不存在的id;
如果存在,统计出存在的id,以及在哪个csv文件里存在。
手动用grep一行一行找肯定不行,太多了,也不好统计。
可以用脚本实现。
二、sh脚本代码
#!/bin/bash
keywords=("372522705401" "372532703601")
csvPath="/home/ubantu/prod_master/Masters/*.csv"
haveFileList=""
noFileList=""
# 用关联数组记录关键词对应找到的文件名(多个文件用空格隔开)
declare -A found_files
# 遍历关键词
for keyword in "${keywords[@]}"; do
  found_files["$keyword"]=""
  for file in $csvPath; do
    if grep -q "$keyword" "$file"; then
      found_files["$keyword"]+="$file "
    fi
  done
done
echo "===== 📄 关键词与匹配到的文件 ====="
for keyword in "${keywords[@]}"; do
  if [[ -n "${found_files[$keyword]}" ]]; then
    echo "关键词 '$keyword' ➜ 找到了文件: ${found_files[$keyword]}"
    haveFileList+="$keyword,"
  else
    #echo "关键词 '$keyword' ➜ ❌ 没有找到任何匹配文件"
    noFileList+="$keyword,"
  fi
done
# 移除最后一个多余逗号
haveFileList=${haveFileList%,}
noFileList=${noFileList%,}
echo ""
echo "===== ✅ 找到文件的关键词列表 ====="
echo "$haveFileList"
echo ""
echo "===== ❌ 没有找到文件的关键词列表 ====="
echo "$noFileList"
三、java执行sh的代码
这个与第二个代码一样,只是迁移到了java。
    //测试path是0,生产是1
    String[] masterFilePath = new String[]{"/home/ubantu/prod_master/","/home/ubantu/true_prod_master/"};
    //检查linux上master文件夹里有没有指定的sellerCode
    @ResponseBody
    @RequestMapping("/findLinuxMaster")
    public JSONObject findLinuxMaster(@RequestBody JSONObject reqJson){
        //{"index":0,"sellerCode":"372522705401,372532703601","path":"Masters/*.csv"}
        log.info("findLinuxMaster获取到报文"+reqJson);
        JSONObject backObj = new JSONObject();
        try{
            //入参
            Integer index = reqJson.getInteger("index");
            String sellerCodeStr = reqJson.getString("sellerCode");
            String[] sellerCodes = sellerCodeStr.split(",");
            String path = reqJson.getString("path");
            //先拼接路径
            String csvPath = masterFilePath[index] + path;
            //准备sellerCode参数
            StringBuilder sb = new StringBuilder();
            for(String s : sellerCodes){
                sb.append("\"").append(s).append("\"").append(" ");
            }
            //去掉最后一个空格
            String keywords = sb.toString().substring(0, sb.toString().length()-1);
            //准备sh命令
            String shCmd = "#!/bin/bash\n" +
                    "\n" +
                    "keywords=("+keywords+")\n" +
                    "csvPath=\""+csvPath+"\"\n" +
                    "\n" +
                    "haveFileList=\"\"\n" +
                    "noFileList=\"\"\n" +
                    "\n" +
                    "# 用关联数组记录关键词对应找到的文件名(多个文件用空格隔开)\n" +
                    "declare -A found_files\n" +
                    "\n" +
                    "# 遍历关键词\n" +
                    "for keyword in \"${keywords[@]}\"; do\n" +
                    "  found_files[\"$keyword\"]=\"\"\n" +
                    "  for file in $csvPath; do\n" +
                    "    if grep -q \"$keyword\" \"$file\"; then\n" +
                    "      found_files[\"$keyword\"]+=\"$file \"\n" +
                    "    fi\n" +
                    "  done\n" +
                    "done\n" +
                    "\n" +
                    "echo \"===== \uD83D\uDCC4 关键词与匹配到的文件 =====\"\n" +
                    "for keyword in \"${keywords[@]}\"; do\n" +
                    "  if [[ -n \"${found_files[$keyword]}\" ]]; then\n" +
                    "    echo \"关键词 '$keyword' ➜ 找到了文件: ${found_files[$keyword]}\"\n" +
                    "    haveFileList+=\"$keyword,\"\n" +
                    "  else\n" +
                    "    #echo \"关键词 '$keyword' ➜ ❌ 没有找到任何匹配文件\"\n" +
                    "    noFileList+=\"$keyword,\"\n" +
                    "  fi\n" +
                    "done\n" +
                    "\n" +
                    "# 移除最后一个多余逗号\n" +
                    "haveFileList=${haveFileList%,}\n" +
                    "noFileList=${noFileList%,}\n" +
                    "\n" +
                    "echo \"\"\n" +
                    "echo \"===== ✅ 找到文件的关键词列表 =====\"\n" +
                    "echo \"$haveFileList\"\n" +
                    "\n" +
                    "echo \"\"\n" +
                    "echo \"===== ❌ 没有找到文件的关键词列表 =====\"\n" +
                    "echo \"$noFileList\"\n";
            log.info("Sh Execute Command");
            log.info(shCmd);
            //准备执行sh命令
            // 构建 shell 命令
            String[] command = {"/bin/sh", "-c", shCmd};
            // 创建 ProcessBuilder 对象
            ProcessBuilder pb = new ProcessBuilder(command);
            Process process = pb.start();
            // 获取标准输出
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            StringBuilder output = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                output.append(line).append("\n");
            }
            // 等待命令执行结束
            int exitCode = process.waitFor();
            log.info("Exit code: " + exitCode);
            log.info("sh Output:\n" + output.toString());
            backObj.put("code",0);
            backObj.put("msg","处理成功");
            backObj.put("sh_output",output);
        }catch (Exception e){
            log.info("findLinuxMaster处理失败",e);
            backObj.put("code",-1);
            backObj.put("msg","处理失败,请查看日志");
        }
        return backObj;
    }
linux服务器上接口调用自测方法:
curl -H 'Content-Type:application/json' -d  '   {"index":0,"sellerCode":"372522705401,372532703601","path":"Masters/*.csv"}   ' -XPOST "http://localhost:8080/myController/findLinuxMaster"
四、输出结果
{"msg":"处理成功","sh_output":"===== \uD83D\uDCC4 关键词与匹配到的文件 =====\n关键词 '372522705401' ➜ 找到了文件: /home/ubantu/prod_master/Masters/250901120141_12041_012.csv \n关键词 '372532703601' ➜ 找到了文件: /home/ubantu/prod_master/Masters/250901120135_12041_012.csv \n\n===== ✅ 找到文件的关键词列表 =====\n372522705401,372532703601\n\n===== ❌ 没有找到文件的关键词列表 =====\n\n","code":0}
这里输出了3个数组:
一个是找到了文件的关键词以及所属文件列表
一个是找到了文件的关键词列表
一个是没有找到文件的关键词列表
 
                   
                   
                   
                   
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
                     
              
             
                   54
					54
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
					 
					 
					


 
            