在bash中按日期时间格式排序

这是我的数据的一个例子

ip=1.2.3.4, setup_time=05:58:38.617 GMT Tue Mar 16 2021, foo=moshe, bar=haim
ip=2.3.4.5, setup_time=05:59:30.260 GMT Tue Mar 16 2021, foo=moshe2, bar=haim2

我希望能够按setup_timebash 中的列进行排序。我知道我不能使用,sort因为 sort 只允许按字符串匹配排序,这不是一种格式,YYYY-MM-DD HH:mm:ss因此字符串排序是不可能的。

所以任何想法将不胜感激。

谢谢你

#更新

好的,为了更好地了解我要实现的目标,我创建了以下文件,名为1

ip=1.2.3.4, setup_time=06:58:38.617 GMT Tue Mar 16 2021, foo=moshe, bar=haim
ip=2.3.4.5, setup_time=05:59:30.260 GMT Tue Mar 17 2021, foo=moshe2, bar=haim2
ip=2.3.4.5, setup_time=06:50:30.260 GMT Tue Mar 18 2021, foo=moshe2, bar=haim2

所以我执行了这个:

cat 1 | sed 's/, /!/g' | sort -t '!' -k2,2

我在这里所做的被替换, !所以我可以在排序中使用分隔符,问题是排序是进行字符串排序而不是时间戳排序,所以输出是:

ip=2.3.4.5!setup_time=05:59:30.260 GMT Tue Mar 17 2021!foo=moshe2!bar=haim2
ip=2.3.4.5!setup_time=06:50:30.260 GMT Tue Mar 18 2021!foo=moshe2!bar=haim2
ip=1.2.3.4!setup_time=06:58:38.617 GMT Tue Mar 16 2021!foo=moshe!bar=haim

回答

由于该选项,Sort 能够处理月份名称 M

无需更改, !. 使用空格作为分隔符并发出:

LC_ALL=en sort -k7nr -k5Mr -k6nr -k2r sample

如果您使用它作为文件的内容sample

ip=2.3.4.5, setup_time=05:59:30.260 GMT Tue Apr 1 2021, foo=moshe2, bar=haim2
ip=2.3.4.5, setup_time=05:59:30.260 GMT Tue Mar 17 2021, foo=moshe2, bar=haim2
ip=1.2.3.4, setup_time=06:58:38.617 GMT Tue Mar 16 2021, foo=moshe, bar=haim
ip=1.2.3.4, setup_time=06:58:38.617 GMT Tue Feb 28 2021, foo=moshe, bar=haim
ip=2.3.4.5, setup_time=06:50:30.260 GMT Tue Mar 18 2020, foo=moshe2, bar=haim2
ip=2.3.4.5, setup_time=06:50:30.260 GMT Tue Mar 18 2021, foo=moshe2, bar=haim2

你会得到这个作为输出:

ip=2.3.4.5, setup_time=05:59:30.260 GMT Tue Apr 1 2021, foo=moshe2, bar=haim2
ip=2.3.4.5, setup_time=06:50:30.260 GMT Tue Mar 18 2021, foo=moshe2, bar=haim2
ip=2.3.4.5, setup_time=05:59:30.260 GMT Tue Mar 17 2021, foo=moshe2, bar=haim2
ip=1.2.3.4, setup_time=06:58:38.617 GMT Tue Mar 16 2021, foo=moshe, bar=haim
ip=1.2.3.4, setup_time=06:58:38.617 GMT Tue Feb 28 2021, foo=moshe, bar=haim
ip=2.3.4.5, setup_time=06:50:30.260 GMT Tue Mar 18 2020, foo=moshe2, bar=haim2

指定-k7意味着对第七个字段进行排序。该r选项将排序顺序反转为降序。该M选项根据月份的名称进行排序。该n选项按数字排序。要按时间排序,只需使用 将整个第二个字段(以 string 开头setup_time=)视为固定长度的字符串-k2

LC_ALL=en 在命令行的开头告诉系统使用月份的英文名称。


以上是在bash中按日期时间格式排序的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>