我正在尝试使用"tr"命令,并使用它的-d删除选项。我的目的是按访问日期的顺序重新排列文件列表。
我有一个文件订购文件,其中包含以下内容:
Access: 2014-02-09 21:35:36.642598731 -0700 0) accessedfiles.cpp
Access: 2014-02-10 14:24:01.527811265 -0700 1) accessedfiles.sh
Access: 2014-02-10 14:24:03.563811320 -0700 2) onlyFilesListFile
Access: 2014-02-10 14:24:03.563811320 -0700 3) orderedFile
Access: 2014-02-10 14:23:37.623810616 -0700 4) properlyOrdered
Access: 2014-02-10 14:23:37.543810614 -0700 5) smallestToLargest
Access: 2014-02-09 21:35:36.642598731 -0700 6) strace.txt
Access: 2014-02-09 21:35:36.638598730 -0700 7) sum.cpp
Access: 2014-02-10 13:24:54.415715076 -0700 8) test
Access: 2014-02-09 21:35:36.638598730 -0700 9) testFile
然后我使用命令 tr -d 'Access: ' 从每行中剪切该访问部分(这是通过每行上的 bash 脚本完成的),并在新文件中正确排序以下输出:
2014-02-09213536.642598731-07000)adfil.pp
2014-02-10142401.527811265-07001)adfil.h
2014-02-10142403.563811320-07002)onlyFilLitFil
2014-02-10142403.563811320-07003)ordrdFil
2014-02-10142337.623810616-07004)proprlyOrdrd
2014-02-10142337.543810614-07005)malltToLargt
2014-02-09213536.642598731-07006)tra.txt
2014-02-09213536.638598730-07007)um.pp
2014-02-10132454.415715076-07008)tt
2014-02-09213536.638598730-07009)ttFil
所以我现在有日期在前面和东部使用 grep,但文件名都变得时髦和压缩。知道为什么吗?他们现在将更难与他们的全名相匹配。
这实际上是错误的命令:
tr -d 'Access: '
因为它将删除所有出现的字母 A,C,E,S:
您需要sed
:
sed 's/^ *Access: //'
使用 sed
:
sed -e 's/^Access: //' orderedFile
如果您只需要文件名:
sed -e 's/^.*) //' orderedFile
从 tr
的手册页中,您可以看到:
-d, --delete
delete characters in SET1, do not translate
所以你所做的是删除字符A
、c
、e
、s
、:
和(空格),这就是你得到乱码文件名的原因。
命令man tr
不仅删除了完整的单词"Access:",还删除了字符串"Access:"中出现的每个字母的每个实例。请参阅sed
(http://linux.die.net/man/1/tr)。
删除完整单词的一个好工具是 CC_12 ; 您可以尝试以下方法:
sed 's/^Access: //' orderedFile > properlyOrdered
awk 替代方案:
awk -F'^Access: ' '$NF=$NF' OFS='' file
tr 不适合这个,切呢?
cut -c 9- < file
鉴于您选择表示日期的格式具有与日期/时间排序相同的字母排序质量 - 您可以对文件进行排序,而无需切行
sort -k2,3 <filename>
(使用字段 2 和 3 排序)。