Linux 上的正则表达式问题 - 排序日期

Linux 上的正则表达式问题 - 排序日期

可以忽略正则表达式中的某些字段。问题是我有来自 FTP 服务器的排序文件的输出。问题是 FTP 不会列出 6 个月或更新的文件的年份。因此,例如,如果我想对此进行排序020319,并且100518我想按日期列出最新的,它将首先排序100518,这不好。

FTP_FILES_LIST 是一个包含来自 FTP 站点的“ls”命令的一堆文件的文件。我使用“grep”仅获取我感兴趣的文件。

A="AT_20_10_REL_ARCA_"

more FTP_FILES_LIST | grep "$A[0-9][0-9][0-9][0-9][0-9][0-9].txt" | sort -k 9

-r-xr-xr-x    1 14       2000     34037013 Jan 17 00:45 AT_20_10_REL_ARCA_011719.txt
-r-xr-xr-x    1 14       2000     34036101 Jan 18 11:13 AT_20_10_REL_ARCA_011819.txt
-r-xr-xr-x    1 14       2000     34036564 Jan 25 01:09 AT_20_10_REL_ARCA_012519.txt
-r-xr-xr-x    1 14       2000     34041306 Feb 03 21:42 AT_20_10_REL_ARCA_020319.txt
-r-xr-xr-x    1 14       2000     34099207 Feb 08 03:15 AT_20_10_REL_ARCA_020819.txt
-r-xr-xr-x    1 14       2000     34099827 Feb 11 02:55 AT_20_10_REL_ARCA_021119.txt
-r-xr-xr-x    1 14       2000     34010091 Oct 05 00:42 AT_20_10_REL_ARCA_100518.txt
-r-xr-xr-x    1 14       2000     34025780 Nov 26 02:55 AT_20_10_REL_ARCA_112618.txt
-r-xr-xr-x    1 14       2000     34037370 Dec 19 22:10 AT_20_10_REL_ARCA_121918.txt

使用“sed”不会排序,因为它不应该按应有的方式排序。这是输出:

more FTP_FILES_LIST | grep $A[0-9][0-9][0-9][0-9][0-9][0-9] | sed -E 's/^(..)(..)(..)/\3\1\2/' | sort | sed -E 's/^(..)(..)(..)/\2\3\1/'

-r-xr-xr-x    1 14       2000     34010091 Oct 05 00:42 AT_20_10_REL_ARCA_100518.txt
-r-xr-xr-x    1 14       2000     34025780 Nov 26 02:55 AT_20_10_REL_ARCA_112618.txt
-r-xr-xr-x    1 14       2000     34036101 Jan 18 11:13 AT_20_10_REL_ARCA_011819.txt
-r-xr-xr-x    1 14       2000     34036564 Jan 25 01:09 AT_20_10_REL_ARCA_012519.txt
-r-xr-xr-x    1 14       2000     34037013 Jan 17 00:45 AT_20_10_REL_ARCA_011719.txt
-r-xr-xr-x    1 14       2000     34037370 Dec 19 22:10 AT_20_10_REL_ARCA_121918.txt -> Wrong sort!
-r-xr-xr-x    1 14       2000     34041306 Feb 03 21:42 AT_20_10_REL_ARCA_020319.txt
-r-xr-xr-x    1 14       2000     34099207 Feb 08 03:15 AT_20_10_REL_ARCA_020819.txt
-r-xr-xr-x    1 14       2000     34099827 Feb 11 02:55 AT_20_10_REL_ARCA_021119.txt

可以使用 sed 和/或正则表达式将日期成对分组吗?我有六个[0-9];每个日期数字一个。如果我们可以使用 regex 或 sed 对它们进行成对排序怎么办?例如 100518;对 10 进行排序,然后对 05 进行排序,然后对 18 进行排序。

使用more FTP_FILES_LIST | grep "$A[0-9][0-9][0-9][0-9][0-9][9].txt" | sort -k 9是一种解决方法,但我丢失了 2018 年的所有文件。我添加了输出的图片,因为此处的格式发生了变化! 在此输入图像描述

答案1

根据示例,我假设文件名的格式MMDDYY.txtMM月、DD日和YY年。

您可以使用重新排列字符进行排序sed

sed 's/\(....\)\(..\)/\2\1/'| sort | sed 's/\(..\)\(....\)/\2\1/'

或者如果您sed支持-E扩展正则表达式选项

sed -E 's/(....)(..)/\2\1/'| sort | sed -E 's/(..)(....)/\2\1/'

第一个sed将交换第一组 4 个字符 ( MMDD) 和第二组 2 个字符 ( YY)。 ( ) 后面的内容.txt将保持不变。这将更改为100518.txt181005.txt。排序后,字符将被交换回来。

该脚本假设文件名列表已被过滤为仅包含正确格式的名称。否则匹配模式应该更复杂,只匹配 6 个数字,后跟.txt

sort不带选项会将最高日期放在最后,用于sort -r反转顺序

答案2

如果您已经假设时间戳位于字段 9 中,那么您可以sort区分三个日期字段:

sort -k9.24,9.25n -k9.20,9.21n -k9.22,9.23n FTP_FILES_LIST

这是使用 GNU sort 选项对示例输入运行的示例--debug;您可以看到一系列虚线,指示sort连续使用以确定顺序的排序键:

-r-xr-xr-x    1 14       2000     34010091 Oct 05 00:42 AT_20_10_REL_ARCA_100518.txt
                                                                              __
                                                                          __
                                                                            __
____________________________________________________________________________________
-r-xr-xr-x    1 14       2000     34025780 Nov 26 02:55 AT_20_10_REL_ARCA_112618.txt
                                                                              __
                                                                          __
                                                                            __
____________________________________________________________________________________
-r-xr-xr-x    1 14       2000     34037370 Dec 19 22:10 AT_20_10_REL_ARCA_121918.txt
                                                                              __
                                                                          __
                                                                            __
____________________________________________________________________________________
-r-xr-xr-x    1 14       2000     34037013 Jan 17 00:45 AT_20_10_REL_ARCA_011719.txt
                                                                              __
                                                                          __
                                                                            __
____________________________________________________________________________________
-r-xr-xr-x    1 14       2000     34036101 Jan 18 11:13 AT_20_10_REL_ARCA_011819.txt
                                                                              __
                                                                          __
                                                                            __
____________________________________________________________________________________
-r-xr-xr-x    1 14       2000     34036564 Jan 25 01:09 AT_20_10_REL_ARCA_012519.txt
                                                                              __
                                                                          __
                                                                            __
____________________________________________________________________________________
-r-xr-xr-x    1 14       2000     34041306 Feb 03 21:42 AT_20_10_REL_ARCA_020319.txt
                                                                              __
                                                                          __
                                                                            __
____________________________________________________________________________________
-r-xr-xr-x    1 14       2000     34099207 Feb 08 03:15 AT_20_10_REL_ARCA_020819.txt
                                                                              __
                                                                          __
                                                                            __
____________________________________________________________________________________
-r-xr-xr-x    1 14       2000     34099827 Feb 11 02:55 AT_20_10_REL_ARCA_021119.txt
                                                                              __
                                                                          __
                                                                            __
____________________________________________________________________________________

以这种方式进行排序很脆弱,因为它依赖于从第 9 个空格分隔字段开始的文件名。另一种方法是依赖文件名模式本身,也许是第六个下划线分隔的时间戳的出现:

sort -t_ -k6.5,6.6n -k6.1,6.2n -k6.3n,6.4n FTP_FILES_LIST

相关内容