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

标签 bash sorting datetime

这是我的数据示例

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/

相关文章:

bash - Infile 更改项目的填充

Linux Bash shell : Leaving some ANSI codes (moSTLy color) and not interpreting some others from string in a function call

关于 'while + read' .vs. 的性能问题AWK

c - 对哈希表进行排序 Glib - qsort

python - 在 Pandas 的指定时间间隔内重新采样?

python - 给定比例将文件随机分发到训练/测试中

java - 按 X 值对 List<Point> 进行排序的有效方法

c - 在 c 中按字母顺序升序和降序对用户输入名称数组进行排序

java - 不指定格式的自动日期/时间解析器

c# - Entity Framework Code First DateTime 字段更新修改