9

我在命令行中使用 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

但正如您所看到的,这并没有像预期的那样工作。知道他们为什么要换地方吗?

4

3 回答 3

25

来自man cut

所选输入的写入顺序与读取顺序相同,并且只写入一次。

使用awk '{print $5,$6,$7,$8,$3,$4,$1}'而不是cut.

于 2013-01-01T16:56:27.987 回答
6

cut不会重新排序其输出。它只是收集要打印的列的列表,然后在它们到达时将它们打印出来。

使用不同的工具(例如 Awk)对输出列重新排序。

但是,在这种特殊情况下,请尝试使用statorfind代替ls。通常不建议尝试从ls. 见http://mywiki.wooledge.org/ParsingLs

于 2013-01-01T16:42:44.277 回答
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
于 2013-01-01T20:26:02.557 回答