首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Shell -如何从for循环中的文件中提取和替换值

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

Stack Overflow用户
提问于 2018-09-24 16:42:10
回答 1查看 171关注 0票数 0

我正在编写示例脚本,它将从码头容器中收集日志。

容器正在运行.NET核心应用程序(*.dll文件),日志文件使用Nlog写入同一个目录(程序集文件所在的位置)。

代码语言:javascript
运行
复制
  #!/bin/bash

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
    echo "Copying log files from container ${container}"
    imagename=$(echo $i | cut -d"," -f2 | cut -d"/" -f4 | cut -d":" -f1)
    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}
done

rm -rf docker_running.txt

脚本应该做什么:

  1. 检查/var/log中的XXX目录,如果不存在,请创建
  2. 根据今天的日期在/var/log/XXX中创建一个新目录
  3. 对于每个正在运行的docker容器,使用容器散列(文本文件中的第一个值)和时间戳在基目录中创建一个目录(请参见p.2)
  4. 使用docker cp命令和容器的图像名称(文本文件中的第二个值)从容器文件系统复制日志文件

这里有一个问题--如何从文本文件中获取第二个值并在shell脚本中替换它?

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

代码语言:javascript
运行
复制
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

第一个是容器ID,第二个(在冒号之后)是一个图像名称+标记,前面有停靠器注册地址。

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

Upd:脚本似乎正在工作,最后一个问题是如何将图像名替换为docker cp命令:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2018-09-25 13:10:01

最终(有效)版本如下:

代码语言:javascript
运行
复制
#!/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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52483865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档