首页 > 解决方案 > 在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

标签: bashsortingdatetime

解决方案


由于该选项,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在命令行的开头告诉系统使用月份的英文名称。


推荐阅读