You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

需求:通过Shell脚本或awk筛选4天前的lpstat -o输出

筛选超过4天的打印任务解决方案

以下提供三种实现方式,均可从lpstat -o输出中筛选出超过4天的打印任务,仅输出任务ID:

方法一:awk结合date命令(通用跨年度场景)

通过时间戳计算日期差,支持跨年度任务筛选:

# 获取当前日期(2022-12-08)的时间戳
current_ts=$(date -d "2022-12-08" +%s)

# 处理lpstat输出,筛选符合条件的任务
lpstat -o | awk -v ts="$current_ts" '{
    # 拼接任务日期字符串(年、月、日)
    job_date = $7 " " $6 " " $5
    # 将任务日期转为时间戳
    cmd = "date -d \"" job_date "\" +%s"
    cmd | getline job_ts
    close(cmd)
    # 计算天数差,超过等于4天则输出任务ID
    if ((ts - job_ts) >= 4*86400) print $1
}'

方法二:纯awk内置函数计算(同年度高效场景)

若所有任务均在同一年(如示例中的2022年),可使用纯awk实现,无需调用外部命令,效率更高:

lpstat -o | awk -v curr_year=2022 -v curr_month=12 -v curr_day=8 '
BEGIN {
    # 建立月份缩写到数字的映射
    split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", month_list, " ")
    for (i=1; i<=12; i++) month_map[month_list[i]] = i
}
# 计算日期是当年的第几天
function day_of_year(y, m, d,    days, i) {
    days = [31,28,31,30,31,30,31,31,30,31,30,31]
    # 处理闰年2月天数
    if (y%4==0 && (y%100!=0 || y%400==0)) days[2] = 29
    for (i=1; i<m; i++) d += days[i]
    return d
}
{
    job_y = $7 + 0
    job_m = month_map[$6]
    job_d = $5 + 0
    # 计算当前日期和任务日期的年度天数差
    diff = day_of_year(curr_year, curr_month, curr_day) - day_of_year(job_y, job_m, job_d)
    if (diff >=4) print $1
}'

方法三:Shell脚本逐行处理

用Shell循环逐行读取输出,转换日期格式后直接比较:

#!/bin/bash

# 设置当前日期
current_date="2022-12-08"
# 计算4天前的日期(YYYY-MM-DD格式)
four_days_ago=$(date -d "$current_date -4 days" +"%Y-%m-%d")

# 遍历lpstat输出
lpstat -o | while read job_id _ _ _ day month year rest; do
    # 将任务日期转为YYYY-MM-DD格式
    job_date=$(date -d "$year $month $day" +"%Y-%m-%d")
    # 日期比较,符合条件则输出任务ID
    [[ "$job_date" <= "$four_days_ago" ]] && echo "$job_id"
done

内容的提问来源于stack exchange,提问作者Ravi Pandey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:01:20