grep命令批量查找csv文件符合条件的数据并统计

一、需求

有一系列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个数组:
一个是找到了文件的关键词以及所属文件列表
一个是找到了文件的关键词列表
一个是没有找到文件的关键词列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐梦想永不停

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值