可以忽略正则表达式中的某些字段。问题是我有来自 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.txt
为MM
月、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.txt
等181005.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