尝试使用 awk 使 ls 显示非目录

尝试使用 awk 使 ls 显示非目录

我试图显示所有非目录文件的列表。我输入ls -la | awk '$1 != "d*"'希望它不会在第一列中显示任何以 开头的字符串,d但它没有按照我预期的方式工作。我的错误在哪里?

答案1

!=只是一个字符串比较(或数字比较,具体取决于要比较的内容)运算符。对于字符串比较 ( A != B),根据awk实现的不同,它可以是字节到字节的比较,或者对于某些(根据 POSIX 的要求),它是 的缩写A < B || A > B,即A != B测试AB的排序是否不同。

无论如何,它都不是模式匹配运算符。为此,您有~运算符(用 取反!~),尽管这是用于正则表达式匹配,而不是通配符模式匹配。你需要:

ls -la | awk '$1 !~ /^d/'

虽然在这里,你也可以使用:

ls -la | grep -v '^d'

有了$1 != "d*",就会返回真的对于除第一个字段之外的任何内容(或与某些实现的排序相同awkd*d*因为正则表达式匹配任意数量(包括 0)的d,因此$1 !~ "d*"总是会返回,false因为任何字符串至少包含 0 d

答案2

尝试这个 ...

  $ls -la | awk '$1 !~ /[d].*/ '
                 or
  $ls -l | grep -v ^d

答案3

  • 您想使用!~而不是!=匹配正则表达式。awk '$1 !~ /^d/
  • 您不想解析 的输出,ls因为它本质上是脆弱的。
  • 如果您只是寻找非目录,find有一个-type可以使用的选项(您想查看-type f.

相关内容