能否在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
相关产品推荐
相关产品推荐

