Shell-如何在for循环中从文件中提取和替换值

时间:2018-09-24 16:42:11

标签: shell docker for-loop sh

我正在编写示例脚本,该脚本将从Docker容器中收集日志。
容器正在运行.NET Core应用程序(* .dll文件),并且使用Nlog将日志文件写入同一目录(程序集文件所在的目录)。

docker cp

脚本应该做什么:

  1. 检查/ var / log中XXX目录的存在,如果不存在则创建
  2. 根据今天的日期在/ var / log / XXX中创建一个新目录
  3. 对于每个运行的docker容器,使用容器哈希值(文本文件中的第一个值)和时间戳在基目录(请参阅第2页)内创建一个目录
  4. 使用sergey@023:~$ cat docker_running.txt b0a6dbb31f4e,ecse00:5000/develop/client-api:latest d80f5e5a2cf5,ecse00:5000/develop/document-uploader:latest 965e9b40a8d0,ecse00:5000/develop/data-analysis:latest ef8a6bad36a7,ecse00:5000/develop/job-aggregator:latest be4ccd899a61,ecse00:5000/develop/capture-plugin:latest 命令和容器的图像名称(文本文件中的第二个值)从容器文件系统复制日志文件

这里我有一个问题-如何从文本文件中获取第二个值并将其替换为Shell脚本?

放置到文件中的docker示例输出为:

docker cp

第一个是容器ID,第二个(在冒号之后)是映像名称+标记,其前面是docker注册表地址。

我尝试了很多选项,但仍然不知道如何正确编写脚本。

更新:该脚本似乎正在运行,最后一个问题是如何将图像名称替换为sergey@ECSE00:~$ sh collect_logs.sh Checking log dir presence Log dir created Creating log dir for the current log saving iteration Copying log files from container f44d14d08b61 Error: No such container:path: f44d14d08b61:/app/\${imagename@Q}_app.json Error: No such container:path: f44d14d08b61:/app/\${imagename@Q}_errors.json Error: No such container:path: f44d14d08b61:/app/\${imagename@Q}_sql.json Error: No such container:path: f44d14d08b61:/app/\${imagename@Q}_webHost.json Checking log dir presence Log dir exist Creating log dir for the current log saving iteration Copying log files from container 13f0069c207a client-api Error: No such container:path: 13f0069c207a:/app/\${imagename@Q}_app.json Error: No such container:path: 13f0069c207a:/app/\${imagename@Q}_errors.json Error: No such container:path: 13f0069c207a:/app/\${imagename@Q}_sql.json Error: No such container:path: 13f0069c207a:/app/\${imagename@Q}_webHost.json Checking log dir presence Log dir exist Creating log dir for the current log saving iteration Copying log files from container 8ff648fa8b04 document-uploader Error: No such container:path: 8ff648fa8b04:/app/\${imagename@Q}_app.json Error: No such container:path: 8ff648fa8b04:/app/\${imagename@Q}_errors.json Error: No such container:path: 8ff648fa8b04:/app/\${imagename@Q}_sql.json Error: No such container:path: 8ff648fa8b04:/app/\${imagename@Q}_webHost.json Checking log dir presence Log dir exist Creating log dir for the current log saving iteration Copying log files from container 1ee8ad5cab31 data-analysis Error: No such container:path: 1ee8ad5cab31:/app/\${imagename@Q}_app.json Error: No such container:path: 1ee8ad5cab31:/app/\${imagename@Q}_errors.json Error: No such container:path: 1ee8ad5cab31:/app/\${imagename@Q}_sql.json Error: No such container:path: 1ee8ad5cab31:/app/\${imagename@Q}_webHost.json Checking log dir presence Log dir exist Creating log dir for the current log saving iteration Copying log files from container 53a8467cd7f6 job-aggregator Error: No such container:path: 53a8467cd7f6:/app/\${imagename@Q}_app.json Error: No such container:path: 53a8467cd7f6:/app/\${imagename@Q}_errors.json Error: No such container:path: 53a8467cd7f6:/app/\${imagename@Q}_sql.json Error: No such container:path: 53a8467cd7f6:/app/\${imagename@Q}_webHost.json 命令:

new

1 个答案:

答案 0 :(得分:0)

最终(有效)版本如下:

#!/bin/sh

DATE=`date +%Y%m%d`
LOGPATH="/var/log/kbci-ocr"
LOGDIR="${LOGPATH}/LOG-${DATE}"
LOGERR="${LOGDIR}/err.log"

docker ps --format {{.ID}},{{.Image}} > docker_running.txt
file=docker_running.txt
for i in `cat $file`
do
        echo "Checking log dir presence"
        if [ ! -d $LOGDIR ]
        then
                mkdir -p $LOGDIR
                echo "Log dir created"
        else
                echo "Log dir exist"
        fi
        echo "Creating log dir for the current log saving iteration"
        container=$(echo $i | cut -d"," -f1)
        TARGETDIR="${LOGDIR}/${container}_$(date +%Y%m%d_%H%M%S)"
        mkdir -p $TARGETDIR
        imagename=$(echo $i | cut -d"," -f2 | cut -d"/" -f4 | cut -d":" -f1)
        echo "Copying log files from container ${container} \ image ${imagename} to path ${TARGETDIR}"
        if [ "$imagename" = "client-api" ]
        then
                $(docker cp ${container}:/app/\\${imagename}_app.json $TARGETDIR)
                $(docker cp ${container}:/app/\\${imagename}_errors.json $TARGETDIR)
                $(docker cp ${container}:/app/\\${imagename}_sql.json $TARGETDIR)
                $(docker cp ${container}:/app/\\${imagename}_webHost.json $TARGETDIR)
        elif [ "$imagename" = "data-analysis" ]
        then
                $(docker cp ${container}:/app/\\${imagename}_app.json $TARGETDIR)
                $(docker cp ${container}:/app/\\${imagename}_sql.json $TARGETDIR)
        elif [ "$imagename" = "job-aggregator" ]
        then
                $(docker cp ${container}:/app/\\${imagename}_app.json $TARGETDIR)
                $(docker cp ${container}:/app/\\${imagename}_mt.json $TARGETDIR)
        elif [ "$imagename" = "document-uploader" ]
        then
                $(docker cp ${container}:/app/\\${imagename}_app.json $TARGETDIR)
        elif [ "$imagename" = "capture-plugin" ]
        then
                $(docker cp ${container}:/app/\\${imagename}_app.json $TARGETDIR)
                $(docker cp ${container}:/app/\\${imagename}_mt.json $TARGETDIR)
                $(docker cp ${container}:/app/\\${imagename}_sql.json $TARGETDIR)
        fi
done

rm -rf docker_running.txt