shell筛选log

服务器跑 pbs 脚本的时候,会分配一个 job ID,并相应地创建两个文件 <NAME>.o<ID><NAME>.e<ID> 来分别装标准输出和错误输出。当提交了多个 pbs 脚本(如通过 [1] 批量创建)时,有些先跑完、有些还在跑。

[2] 的 Example 1 写过一种无脑全删的命令,但现在要根据 job ID 仅删掉那些已经跑完的 pbs jobs 的 log 文件。qstat 可以查目前正在跑、等的 pbs jobs,输出形如:

Job ID                    Name             User            Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
154497.mu01                daemon-gpu1      iTom      28:01:37 R gpu            
154498.mu01                daemon-gpu2      iTom             0 Q gpu

只取 Job ID 一列中的数字(假设 job ID 会重复)。而 log 文件名形如:daemon-gpu1.e154497daemon-gpu1.o154497

Code

  • $? 是函数返回值,即同「上一条命令」的返回值。可能会被当成 error code?是的话就不能用 set -e
#!bin/bash

# 指定根目录
P=$1
P=${P:="."}  # 默认当前目录

# 无脑全删
# ls -d ./* | grep -E "*.[oe][0-9]+" | xargs rm

# 找 log 文件
log_files=$(ls -d $P/* | grep -E "*.[oe][0-9]+")
# echo ${log_files[@]}
if [ ${#log_files[@]} -eq 0 ]; then
    exit
fi

# 通过 `qstat` 找正在跑、等的 pbs job IDs
# 保留它们对应的 log 文件
running_id=$(qstat | awk '{if((NR>2)) {print $1}}' | sed 's/\([0-9]\{0,\}\)\..*/\1/')
# echo ${running_id[@]}

# 判断一个 ID 是否 running IDs 之一
exist()
{
    for _rid in ${running_id[@]}; do
        if [ $_rid == $1 ]; then
            return 1
        fi
    done
    return 0
}

# 逐 log 操作
for f in ${log_files[@]}; do
    # 该 log 文件的 ID
    id=$(basename $f | sed 's/[^\.]*\.[eo]\([0-9]\{0,\}\)/\1/')
    # echo $id
    exist $id
    if [ $? -eq 0 ]; then
        # echo delete: $f
        rm $f
    fi
done

References

  1. sed修改文件内容
  2. shell递归遍历目录删log
  3. sed 简明教程
  4. Sed 命令详解 & 正则表达式
  5. Shell 函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值