Linux / Unix tr命令,奇怪的行为

时间:2014-02-10 21:40:05

标签: linux bash unix tr

我正在尝试使用“tr”命令,并使用它的-d delete选项。我的目的是按照访问日期的顺序重新排列文件列表。

我有一个文件orderedFile,其中包含以下内容:

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:'来切断每行的Access部分(这是通过每行上的bash脚本完成的)并且我在newOrdered的新文件中得到以下输出:

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 on,但是文件名已经变得非常时髦和压缩了。知道为什么吗?他们现在很难与他们的全名相匹配。

6 个答案:

答案 0 :(得分:3)

实际上这是错误的命令:

tr -d 'Access: ' 

因为它会删除字母a,c,e,s的每次出现:

您需要sed

sed 's/^ *Access: //'

答案 1 :(得分:2)

使用sed

sed -e 's/^Access: //' orderedFile

如果您只想要文件名:

sed -e 's/^.*) //' orderedFile

tr的联机帮助页中,您可以看到:

 -d, --delete
              delete characters in SET1, do not translate

所以你 做的是删除字符Aces:(空格),这就是你得到乱码文件的原因。

答案 2 :(得分:1)

命令tr -d 'Access:'不只是删除完整的单词'Access:',它会删除字符串'Access:'中出现的每个字母的每个实例。见man trhttp://linux.die.net/man/1/tr)。

删除完整字词的好工具是sed;你可以尝试以下方法:

sed 's/^Access: //' orderedFile > properlyOrdered

答案 3 :(得分:1)

awk替代方案:

awk -F'^Access: ' '$NF=$NF' OFS='' file

答案 4 :(得分:0)

tr不适合这个,怎么样切?

cut -c 9- < file

答案 5 :(得分:0)

鉴于您选择代表日期的格式具有字母顺序的质量与日期/时间顺序相同 - 您可以对文件进行排序,而无需使用

来删除行
sort -k2,3 <filename>

(使用字段2和3排序)。