【问题标题】:Sorting output with awk, and formatting it使用 awk 对输出进行排序并格式化
【发布时间】:2010-12-23 15:38:21
【问题描述】:

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

ls -la | awk {'打印 $6,$7,$8,$9,$10'} | grep "十二月" |排序-r |头-5 12 月 4 日 20:15 文件夹/ 12 月 4 日 19:51 ./ 12 月 4 日 17:42 文件夹\约翰/ 12月4日 16:19 作业\MAT\ 08/ 12 月 4 日 16:05 文件夹\ 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

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

【问题讨论】:

    标签: sorting awk rename


    【解决方案1】:

    这是你的答案之一:

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

    使用ls -lA 而不是ls -la

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

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

    我没有得到反斜杠的空格,所以我不知道你为什么会这样。要修复它,您可以添加以下内容:

    | sed 's/\\//g'
    

    【讨论】:

    • 我仍然在 12 月 4 日 19:51 运行。/ 当我运行时:ls -lA | awk {'打印 $6,$7,$8,$9,$10'} | grep "十二月" |排序-r |头 -5
    • ls -A 打印除... 之外的所有以句点开头的文件夹。您使用的是标准 GNU 工具还是其他工具?
    • 马克,请原谅我的无知,但我如何检查并确保它们不是标准的? ls -lA | awk '{ for (i=6; i test.txt;head -3 test.txt 12 月 5 日 17:18 ./ 12 月 4 日 14:50 ../ ls --version ls (GNU coreutils) 5.97 版权所有 (C) 2006 Free Software Foundation, Inc.是免费软件。您可以根据 GNU 通用公共许可证 gnu.org/licenses/gpl.html> 的条款重新分发它的副本。在法律允许的范围内,不提供任何保证。由 Richard Stallman 和 David MacKenzie 撰写。
    • 这是标准的 GNU ls,但您的 coreutils 版本是 2006 年的。也许是时候升级了?拥有旧软件会增加您被黑客入侵的风险。
    • 我更新了我的解决方案以删除反斜杠,如果你这样做,它将解决你的问题,但我强烈建议你调查一下为什么你的系统对于像 ls 这样的基本操作返回不正确的结果。如果像 ls 这样简单的事情没有按预期工作,那么您的系统就会出现严重问题。
    【解决方案2】:

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

    很明显,有些东西正在为您转义空格,以便您的 awk 打印这些文件,因为 awk 往往会用空格分隔字段,这就是 \ 字符的用途。

    Spaces 是文件名,专为阻止您在此处尝试编写简单的脚本和管道混搭而设计。

    【讨论】:

      【解决方案3】:

      你可以通过添加grep -v "\." | grep -v "\.\."来删除...

      其他的不清楚

      【讨论】:

        【解决方案4】:

        你可以过滤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"'
        

        【讨论】:

        • 不反对在 perl 中做,如果这样做更容易,我知道我会满足。
        【解决方案5】:

        您可以使用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 中,我为行的开头添加了一个匹配项,因此它不会匹配一个名为“Decimal”的文件,该文件在 11 月进行了修改。

        【讨论】:

          【解决方案6】:

          看到带有 awk 和 grep/sed 的管道让我很恼火。 awk 是一个非常强大的行处理工具。

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

          【讨论】:

            【解决方案7】:

            所有的 greps 和 seds 是怎么回事???

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

            【讨论】:

            • 这有一个问题是不显示名称以“。”结尾的文件
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-08
            • 2019-01-08
            • 2018-04-23
            • 1970-01-01
            • 2016-12-23
            • 1970-01-01
            相关资源
            最近更新 更多