这是我的数据示例
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
我希望能够按 bash 中的 setup_time
列进行排序。我知道我不能使用 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
最佳答案
由于选项 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
选项按数字排序。要按时间排序,只需将整个第二个字段(以字符串 setup_time=
开头)视为使用 -k2
的固定长度字符串。
LC_ALL=en
告诉系统使用月份的英文名称。
关于bash - 在 bash 中按日期时间格式排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67606712/