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

能否在Bash中按指定日期排序进程?如何实现该功能?

在Bash中按指定日期筛选并排序进程

没问题!我来帮你补全这段Bash代码,实现按指定日期筛选并排序进程的功能。首先先修正原代码里的一个小bug,然后一步步实现需求:

第一步:修正日期验证的小错误

原代码里的正则匹配误用了$date变量,但实际用户输入存在$a里,先把这部分改对:

#!/bin/bash
echo "Insert the date yyyy-mm-dd"
read a
# 修正:把$date改成$a,匹配用户输入的变量
if ! [[ $a =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
    echo "Date is not valid"
elif b=$(date --date="$a" '+%Y-%m-%d'); then
    # 这里开始写后续筛选排序逻辑
fi

第二步:计算指定日期的时间范围

我们需要把输入的日期转换成当天的起始时间戳(00:00:00)和结束时间戳(23:59:59),这样就能精准筛选当天启动的进程:

# 计算指定日期的起始和结束时间戳(Unix时间,单位秒)
start_ts=$(date --date="$a 00:00:00" +%s)
end_ts=$(date --date="$a 23:59:59" +%s)

第三步:筛选并排序进程

用ps命令获取进程的PID、启动时间和命令,再通过awk把进程的启动时间转换成时间戳,和我们的时间范围对比,最后按启动时间排序输出:

# 筛选指定日期启动的进程,并按启动时间排序
ps -eo pid,lstart,cmd --no-headers | awk -v start="$start_ts" -v end="$end_ts" '
{
    # 把进程的启动时间字符串转换成时间戳
    cmd = "date --date=\""$2" "$3" "$4" "$5" "$6"\" +%s"
    cmd | getline proc_ts
    close(cmd)
    # 判断进程启动时间是否在指定日期范围内
    if (proc_ts >= start && proc_ts <= end) {
        print $0
    }
}' | sort -k2,6  # 按启动时间的字段(第2到第6列)排序

完整代码整合

把所有部分整合起来,就是完整的可运行脚本:

#!/bin/bash
echo "Insert the date yyyy-mm-dd"
read a

# 验证日期格式合法性
if ! [[ $a =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
    echo "Date is not valid"
elif b=$(date --date="$a" '+%Y-%m-%d'); then
    # 计算指定日期的时间范围戳
    start_ts=$(date --date="$a 00:00:00" +%s)
    end_ts=$(date --date="$a 23:59:59" +%s)

    echo "Processes started on $a (sorted by start time):"
    echo "-------------------------------------------------"
    # 筛选并按启动时间排序进程
    ps -eo pid,lstart,cmd --no-headers | awk -v start="$start_ts" -v end="$end_ts" '
    {
        cmd = "date --date=\""$2" "$3" "$4" "$5" "$6"\" +%s"
        cmd | getline proc_ts
        close(cmd)
        if (proc_ts >= start && proc_ts <= end) {
            print $0
        }
    }' | sort -k2,6
else
    echo "Invalid date: $a"
fi

关键说明

  • ps -eo pid,lstart,cmd:指定输出进程的PID、完整启动时间(包含日期和时分秒)以及进程命令
  • awk部分负责将进程的启动时间字符串转换为Unix时间戳,完成时间范围的过滤
  • sort -k2,6:按启动时间的字段(第2到第6列,对应lstart的日期时间部分)排序,实现进程按启动时间从早到晚排列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:37:30