ChatGPT|使用 ChatGPT 开发批量 kafka-log-dump 的 Shell 脚本记录

开发需求

/home/myself/src-logs/ 中为 kafka-logs 中的 TOPIC 的 SegmentLog,包括多个 .log.timeindex 等不同后缀的日志文件。

我们需要使用 kafka-dump-log.sh 将所有 .log 文件 dump 出来,并逐个将结果写入到其他文件。

ChatGPT 实现过程

提问

用 shell 写一个脚本:遍历文件夹下的所有后缀为 .log 的文件,并执行 sh /opt/kafka/bin/kafka-dump-log.sh --files /home/myself/src-logs/{遍历到的文件名} --print-data-log > /home/myself/dump-logs/{文件名}.log 这个命令。

ChatGPT 回答

以下是一个可用的 shell 脚本,可以遍历指定目录下所有后缀为 .log 的文件并执行给定命令:

#!/bin/bash

# 指定遍历的目录
dir="/home/myself/src-logs"

# 如果目录不存在或不是目录,则输出错误信息并退出
if [ ! -d "$dir" ]; then
  echo "Error: $dir is not a directory"
  exit 1
fi

# 遍历目录找到所有后缀为 .log 的文件,并执行给定的命令
for file in "$dir"/*.log; do
  if [ -f "$file" ]; then
    sh /opt/kafka/bin/kafka-dump-log.sh --files "$file" --print-data-log > "/home/myself/dump-logs/${file##*/}"
  fi
done

说明:

  • #! 行指定脚本使用的解释器,在这里使用了 bash。
  • dir 变量指定要遍历的目录路径。
  • if 语句检查目录是否存在,并在目录不存在时输出错误信息并终止脚本执行。
  • for 循环遍历所有后缀为 .log 的文件,并对每个文件执行指定的命令。
  • ${file##*/} 可以获取 $file 变量中最后一个 / 后面的字符串,即文件名(去掉目录路径)。

注意:在执行此脚本前,请确保已经在正确的目录下进行操作,并且 /opt/kafka/bin/kafka-dump-log.sh 命令已安装在您的系统中。

提问

请解释一下 ${file##*/} 是怎么实现获取文件名的?

ChatGPT 回答

在 shell 脚本中,${file##*/} 是一种通用的方式,用于从一个包含路径的字符串中提取文件名。

具体地讲,${file##*/} 中的 ## 表示删除字符串左侧的最长匹配项,即找到最后一个 /(路径分隔符)并将其及其左边的内容全部删除。因此,这个操作后得到的就是字符串中的文件名部分。

举个例子,如果我们有一个文件路径为 /usr/local/bin/bash,那么 ${file##*/} 就会返回 bash 这个字符串,因为这是这个路径中的最后一个 / 右侧的部分。使用这个语法可以方便地从文件路径中提取文件名,不需要手动解析路径字符串。

猜你喜欢

转载自blog.csdn.net/Changxing_J/article/details/130313981