我在命令行中使用cut命令,似乎我无法得到我喜欢的输出。 你知道我为什么这么做吗?这是我做错了吗?
这是正常输出,我想以不同的顺序输出:
[root@upbvm500 root]# ls -al IDS_DIR/a | tr -s " "
-rw-r--r-- 1 root root 0 Jan 1 17:18 IDS_DIR/a
[root@upbvm500 root]#
[root@upbvm500 root]# ls -al IDS_DIR/a | tr -s " " | cut -d" " -f5,6,7,8,3,4,1
-rw-r--r-- root root 0 Jan 1 17:18
但正如你所看到的,这并不像预期的那样有效。 知道他们为什么要转换位置吗?
答案 0 :(得分:22)
来自man cut
:
所选输入的读取顺序与读取顺序相同,只写一次。
使用awk '{print $5,$6,$7,$8,$3,$4,$1}'
代替cut
。
答案 1 :(得分:6)
cut
不会重新排序其输出。它只是收集要打印的列的列表,然后在它们到达时打印出来。
使用其他工具(如Awk)重新排序输出列。
但是,在这种情况下,请尝试使用stat
或find
代替ls
。通常不建议尝试解析ls
的输出。见http://mywiki.wooledge.org/ParsingLs
答案 2 :(得分:6)
正如其他人所提到的,不要解析ls。如果您需要文件信息,请使用stat
stat -c "%s %y %U %G %A %n" filename
您可能需要做一些额外的工作来根据需要格式化时间戳。
$ ls -l data
-rw-r--r-- 1 glennj glennj 13 2013-01-01 11:19 data
$ LC_TIME=POSIX ls -l data
-rw-r--r-- 1 glennj glennj 13 Jan 1 11:19 data
$ stat -c "%s %y %U %G %A %n" data
13 2013-01-01 11:19:53.670015242 -0500 glennj glennj -rw-r--r-- data
$ stat -c "%s %Y %U %G %A %n" data | awk '{$2 = strftime("%b %e %H:%M", $2)} 1'
13 Jan 1 11:19 glennj glennj -rw-r--r-- data