2009-12-05 71 views
2

我想要的ls -la的输出格式为仅包含在十二月修改过的文件和输出他们很好,这是他们目前的样子:排序与awk的输出,并将其格式化

 
ls -la | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5 
Dec 4 20:15 folder/ 
Dec 4 19:51 ./ 
Dec 4 17:42 Folder\ John/ 
Dec 4 16:19 Homework\ MAT\ 08/ 
Dec 4 16:05 Folder\ Smith/ 

等。 。

如何设置像一个正则表达式不包括像“./”和“../”的东西,

此外,我怎么能忽略斜杠‘\’对于有空格的文件夹在他们中。我想在最后放下斜线。这可能通过shell命令吗?或者我将不得不使用Perl对测试进行修改?我确实希望日期和时间保持原样。任何帮助将不胜感激!

该框有Linux,这是通过SSH完成的。

编辑:

继承人什么我到目前为止(感谢马克和gbacon此)

ls -laF | grep -vE ' ..?/?$' | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } ' | grep "Dec" | sort -r | head -5 

我只是具有只是一个空间“”代替“\”的麻烦。除此之外感谢所有帮助达到这一点!

回答

1

可以使用find做的大部分工作对您:

find -mindepth 1 -maxdepth 1 -printf "%Tb %Td %TH:%TM %f\n" | grep "^Dec" | sort -r 

父目录(..)不包含在默认情况下。 -mindepth 1摆脱当前目录(。)。您可以删除-maxdepth 1以使其递归,但您应该将%f更改为%p以包含具有文件名的路径。

这些都是在-printf领域:

  • %铽 - 短短的一个月名
  • %Td的 - 该月的一天
  • %TM:%TM - 小时和分钟
  • % f - 文件名

grep中,我添加了一行匹配的行,所以它不会匹配名为“Decim例如,11月份修改过的“al”。

+0

非常好,这工作得很好,谢谢! – 2009-12-06 04:35:45

1

这里是你的答案之一:

我如何设置像一个正则表达式不包括像“./”和“../”,

使用ls -lA而不是ls -la

而是打印出列的固定数量的,可以打印出了从第6列t时行的末尾:

ls -lA | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } ' 

我没有得到的空间反斜线,所以不知道你为什么这样做。要修复它,你可以添加:

| sed 's/\\//g' 
+0

进出口仍然得到 12月4日19:51 ./ 当我运行: LS-LA | awk {'print $ 6,$ 7,$ 8,$ 9,$ 10'} | grep“Dec”| sort -r |头-5 – 2009-12-05 23:11:46

+1

ls -A打印以'.'和'..'开头的所有文件夹。你使用标准的GNU工具还是其他的东西? – 2009-12-05 23:15:31

+0

马克,请原谅我的无知,但我该如何检查并确保它们不是标准之外的东西? ls -lA | awk'{for(i = 6; i <= NF; i ++)printf(“%s”,$ i);的printf( “\ n”); }“> test.txt的;头-3的test.txt 12月5日17时18 ./ 12月4日14点50个../ LS --version LS(GNU的coreutils)5.97 版权(C)2006年自由软件基金会,公司 这是免费软件。您可以根据GNU通用公共许可证的条款 重新分发它的副本。 在法律允许的范围内,不存在任何担保。 由Richard Stallman和David MacKenzie撰写。 – 2009-12-05 23:19:28

1

检查并确保你的'ls'命令不是别名。通常,“原始”ls不会为您提供/ for目录,也不应该逃离这些空间。

很显然,你的awk打印这些文件时,有些东西正在逃避你的空间,因为awk倾向于通过空白打开字段,这就是\字符的用途。

空格是文件名是专门设计来挫败写简单的脚本和管道混搭,就像你在这里试图做的那样。

0

也可以通过添加grep -v "\." | grep -v "\.\."

不知道其余

1

下降...您可以过滤的ls输出:

ls -la | grep -vE ' ..?/?$' | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5 

如果你的内容使用Perl :

ls -la | perl -lane 's/\\//g; 
        print "@F[5..9]" 
         if $F[8] !~ m!^..?/?$! && 
          $F[5] eq "Dec"' 
+0

谢谢你解决了我的问题。和..! – 2009-12-05 23:20:19

+1

不客气!乐意效劳。 – 2009-12-05 23:36:24

+0

如果在perl中做这件事更容易,而且我知道我将只是内容,不反对在perl中做。 – 2009-12-05 23:38:54

0

它真的让我很难看到awk和grep/sed的流水线。 Awk是一个非常强大的线处理工具。

ls -laF | awk ' 
    /\.\.?\/$/ {next} 
    /Dec/{for (i=1; i<=5; i++) $i = ""; print} 
' | sort -r | head -5 
1

什么是所有的greps和seds?

ls -laF | awk '!/\.\.\/$/ && !/\.\/$/ &&/Dec/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); }' 
+0

这有一个问题,没有显示名称以“。”结尾的文件。 – Vijay 2009-12-10 11:40:22