使用awk对输出进行排序,并对其进行格式化

时间:2009-12-05 23:03:07

标签: sorting awk rename

我正在尝试将ls -la的输出格式化为仅包含12月修改的文件并输出它们,这就是它们目前的样子:

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完成的。

编辑:

到目前为止我所拥有的(感谢Mark和gbacon)

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

我只是在用“”空格“替换”\“时遇到了麻烦。除此之外感谢所有帮助到此为止!

7 个答案:

答案 0 :(得分:1)

以下是您的答案之一:

  

如何将正则表达式设置为不包含“./”和“../”之类的内容,

使用ls -lA代替ls -la

您可以打印出第6行的所有内容,而不是打印出固定数量的列:

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

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

| sed 's/\\//g'

答案 1 :(得分:1)

检查并确保您的'ls'命令没有其他别名。通常,“raw”ls不会为您提供/ for目录,也不应该转义空格。

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

Spaces是文件名专门设计用于阻止编写简单的脚本和管道mashup,就像你正在尝试做的那样。

答案 2 :(得分: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"'

答案 3 :(得分: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

中的字段
  • %Tb - 短月名称
  • %Td - 每月的某一天
  • %TM:%TM - 小时和分钟
  • %f - 文件名

grep中,我为该行的开头添加了匹配项,因此它与11月修改过的名为“Decimal”的文件不匹配。

答案 4 :(得分:1)

什么是所有的greps和seds ???

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

答案 5 :(得分:0)

您可以通过添加.

来删除..grep -v "\." | grep -v "\.\."

不确定其余的

答案 6 :(得分:0)

我真的很难看到使用awk和grep / sed的管道。 Awk是一个非常强大的线处理工具。

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