bash - 在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_time
bash 中的列进行排序。我知道我不能使用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
在命令行的开头告诉系统使用月份的英文名称。
推荐阅读
- r - 如何在 R 中使用 mutate 将变量用作新列名的一部分?
- android - 如何设置 RecyclerView 高度,以便自定义标签栏不会隐藏 Android 中的列表项
- c - 《The C Programming Language》一书中不同名称的字符串
- algorithm - 我应该使用什么算法来搜索短语集合?
- html - 如何在 html/css 中移动文本
- java - 如何在 JFreeChart 中单击并输出 Y 值 [在我的情况下为价格]?
- graphql - 我的反应变量不会更新(阿波罗客户端)
- c# - 如何仅在 Word 表格单元格中选择文本
- android - 在 Kotlin 改造中调用函数作为发送参数的问题
- discord.js - 我将如何获取 30 天前的旧嵌入消息并结合这些值 [Discord.js V12]