Awk 如何打印日期早于两天的文本行
我有以下正在使用的文本文件,并且当Awk 如何打印日期早于两天的文本行,awk,Awk,我有以下正在使用的文本文件,并且当creationdatetime超过两天时,必须能够仅解析对象名称值 objectname ...........................: \Path\to\file\hpvss-LUN-22May12 22.24.11\hpVSS-LUN-29Aug12 22.39.15 creationdatetime .....................: 01-Sep-2012 02:17:43 objectname ..................
creationdatetime
超过两天时,必须能够仅解析对象名称值
objectname ...........................: \Path\to\file\hpvss-LUN-22May12 22.24.11\hpVSS-LUN-29Aug12 22.39.15
creationdatetime .....................: 01-Sep-2012 02:17:43
objectname ...........................: \Path\to\file\hpVSS-LUN-22May12 22.24.11\hpVSS-LUN-28Aug12 22.16.19
creationdatetime .....................: 03-Sep-2012 10:18:09
objectname ...........................: \Path\to\file\hpVSS-LUN-22May-12 22.24.11\hpVSS-LUN-27Aug12 22.01.52
creationdatetime .....................: 03-Sep-2012 10:18:33
上述命令的输出为:
\Path\to\file\hpvss-LUN-22May12 22.24.11\hpVSS-LUN-29Aug12 22.39.15
任何帮助都将不胜感激
Prem我将分两个阶段进行: 1) 重新格式化输入文件
awk '/objectname/{$1=$2="";file=$0;getline;$1=$2="";print $0" |"file}' inputfile > inputfile2
这样你就可以处理
01-Sep-2012 02:17:43 | \Path\to\file\hpvss-LUN-22May12 22.24.11\hpVSS-LUN-29Aug12 22.39.15
03-Sep-2012 10:18:09 | \Path\to\file\hpVSS-LUN-22May12 22.24.11\hpVSS-LUN-28Aug12 22.16.19
03-Sep-2012 10:18:33 | \Path\to\file\hpVSS-LUN-22May-12 22.24.11\hpVSS-LUN-27Aug12 22.01.52
2) 按日期筛选:
COMPARDATE=$(($(date +%s)-2*24*3600)) # 2 days off
IFS='|'
while read d f
do
[[ $(date -d "$d" +%s) < $COMPARDATE ]] && printf "%s\n" "$f"
done < inputfile2
COMPARDATE=$($(日期+%s)-2*24*3600))#休息2天
IFS=“|”
读d f时
做
[[$(日期-d“$d”+%s)<$COMPARDATE]]&&printf“%s\n”$f
完成<输入文件2
在awk
中解析日期有点棘手,但可以使用mktime
完成。要将月份名称转换为数字,需要定义关联转换数组
路径名中有空格,因此字段分隔符的最佳选择可能是:
(冒号后跟空格)。下面是一个工作的awk脚本:
超过两天。awk
BEGIN {
months2num["Jan"] = 1; months2num["Feb"] = 2; months2num["Mar"] = 3; months2num["Apr"] = 4;
months2num["May"] = 5; months2num["Jun"] = 6; months2num["Jul"] = 7; months2num["Aug"] = 8;
months2num["Sep"] = 9; months2num["Oct"] = 10; months2num["Nov"] = 11; months2num["Dec"] = 12;
now = systime()
two_days = 2 * 24 * 3600
FS = ": "
}
$1 ~ /objectname/ {
path = $2
}
$1 ~ /creationdatetime/ {
split($2, ds, " ")
split(ds[1], d, "-")
split(ds[2], t, ":")
date = d[3] " " months2num[d[2]] " " d[1] " " t[1] " " t[2] " " t[3]
age_in_seconds = mktime(date)
if(now - age_in_seconds > two_days)
print path
}
最后一个块中的所有拆分都是挑选日期位,并将其转换为mktime
接受的格式
按如下方式运行:
awk-f早于两天。awk infle
输出:
\Path\to\file\hpvss-LUN-22May12 22.24.11\hpvss-LUN-29Aug12 22.39.15
谢谢Stephane!有没有办法在awk中进行过滤,因为我在使用gawk的windows环境中工作?如果您打算进行认真的测试处理,我建议您在windows计算机上安装cygwin。这样,你就可以像UNIX机器一样轻松地编写脚本,如果答案令人满意地解决了你的问题,考虑投票并接受它。