需求:通过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
相关产品推荐
相关产品推荐

