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

我希望能够按 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 告诉系统使用月份的英文名称。

https://stackoverflow.com/questions/67606712/

相关文章:

python - 如何在 python 中分组和计算二项式变量?并绘制这个图

java - 如何使用 Arrays.asList() 启动 LinkedList

python - 在新列中计算数据框中的逗号分隔字符串

c# - 在不使用 lambda 表达式的情况下从该方法传递额外参数时在方法内部订阅事件

java - 如何使用 Java 9+ 从 JDK 模块获取类的文件?

kubernetes - Helm : How to avoid recreating secret

laravel - Inertia.JS 在发布请求后重新加载 Prop

Pandas - 提取第 4 个字符后的所有文本

c++ - 为什么 C++ 中 std::string 的复制方法在此程序中显示出奇怪的行为?

python - 无需替换即可生成置换数组