我有一个包含下一个内容的文件:
linux-4.4.1.tar.gz 31-Jan-2016 19:34 127M
linux-4.4.2.tar.gz 17-Feb-2016 20:35 127M
linux-4.4.3.tar.gz 25-Feb-2016 20:13 127M
linux-4.4.4.tar.gz 03-Mar-2016 23:16 127M
linux-4.4.5.tar.gz 09-Mar-2016 23:44 127M
linux-4.4.6.tar.gz 16-Mar-2016 16:28 127M
linux-4.4.7.tar.gz 12-Apr-2016 16:13 127M
linux-4.4.8.tar.gz 20-Apr-2016 07:00 127M
linux-4.4.tar.gz 10-Jan-2016 23:12 127M
linux-4.5.1.tar.gz 12-Apr-2016 16:08 128M
linux-4.5.2.tar.gz 20-Apr-2016 07:00 128M
linux-4.5.tar.gz 14-Mar-2016 04:38 128M
我希望按照日期过滤这些内容,但我不知道我怎么能这样做,到目前为止我只有以下代码来转换日期进行比较,但我不知道如何使用它bash代码以过滤文件:
date -d 20-Apr-2016 +"%Y%m%d"
答案 0 :(得分:2)
while read -r line; do
d=$(date -d "${line:24:11}" +"%Y%m%d")
echo "$d $line"
done < file | sort -k1,1n | cut -d " " -f 2-
输出:
linux-4.4.tar.gz 10-Jan-2016 23:12 127M linux-4.4.1.tar.gz 31-Jan-2016 19:34 127M linux-4.4.2.tar.gz 17-Feb-2016 20:35 127M linux-4.4.3.tar.gz 25-Feb-2016 20:13 127M linux-4.4.4.tar.gz 03-Mar-2016 23:16 127M linux-4.4.5.tar.gz 09-Mar-2016 23:44 127M linux-4.5.tar.gz 14-Mar-2016 04:38 128M linux-4.4.6.tar.gz 16-Mar-2016 16:28 127M linux-4.4.7.tar.gz 12-Apr-2016 16:13 127M linux-4.5.1.tar.gz 12-Apr-2016 16:08 128M linux-4.4.8.tar.gz 20-Apr-2016 07:00 127M linux-4.5.2.tar.gz 20-Apr-2016 07:00 128M
答案 1 :(得分:2)
如果对perl
开放,则最好在其中实施Schwartzian变换。这使用核心模块,因此无需从CPAN安装一个。
perl -MTime::Piece -lane'
push @rows, [ $_, join (" ", $F[1], $F[2]) ];
}{
print for
map { $_->[0] }
sort {
Time::Piece->strptime($a->[1], "%d-%b-%Y %R") <=>
Time::Piece->strptime($b->[1], "%d-%b-%Y %R")
}
map { [ $_->[0], $_->[1] ] } @rows;
' file
linux-4.4.tar.gz 10-Jan-2016 23:12 127M
linux-4.4.1.tar.gz 31-Jan-2016 19:34 127M
linux-4.4.2.tar.gz 17-Feb-2016 20:35 127M
linux-4.4.3.tar.gz 25-Feb-2016 20:13 127M
linux-4.4.4.tar.gz 03-Mar-2016 23:16 127M
linux-4.4.5.tar.gz 09-Mar-2016 23:44 127M
linux-4.5.tar.gz 14-Mar-2016 04:38 128M
linux-4.4.6.tar.gz 16-Mar-2016 16:28 127M
linux-4.5.1.tar.gz 12-Apr-2016 16:08 128M
linux-4.4.7.tar.gz 12-Apr-2016 16:13 127M
linux-4.4.8.tar.gz 20-Apr-2016 07:00 127M
linux-4.5.2.tar.gz 20-Apr-2016 07:00 128M
答案 2 :(得分:1)
如果你习惯使用GNU AWK,那么像这样的脚本可以工作:
<强> conv_date.awk 强>
BEGIN { # sort array numerically
PROCINFO["sorted_in"] = "@ind_num_asc"
# prepare a mapping month name to month-number:
split("JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC", tmp," ")
for( ind in tmp ) { monthMap [ tmp[ ind ] ] = ind }
}
{ split( $2, dt, /[-]/)
ts = mktime( dt[3] " " monthMap[ toupper( dt[2]) ] " " dt[1] " 0 0 0" )
if (ts in lines) lines[ts] = lines[ts] "\n" $0
else lines[ts] = $0
}
END { # output in chronological order
for( l in lines ) print lines[ l ]
}
像这样使用:awk -f conv_date.awk your_file
答案 3 :(得分:0)
保存脚本
#!/bin/bash
reorder()
{
awk '{printf "%s %s %s %s\n",$2,$3,$1,$4}' $1 \
| sort -t'-' -k2 -M \
| awk '{printf "%s %s %s %s\n",$3,$1,$2,$4}' #You can omit this pipe
}
reorder $1
as sortcontent.sh并像
一样运行./sortcontent.sh your_file_name