![尝试使用 awk 使 ls 显示非目录](https://linux22.com/image/93150/%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8%20awk%20%E4%BD%BF%20ls%20%E6%98%BE%E7%A4%BA%E9%9D%9E%E7%9B%AE%E5%BD%95.png)
我试图显示所有非目录文件的列表。我输入ls -la | awk '$1 != "d*"'
希望它不会在第一列中显示任何以 开头的字符串,d
但它没有按照我预期的方式工作。我的错误在哪里?
答案1
!=
只是一个字符串比较(或数字比较,具体取决于要比较的内容)运算符。对于字符串比较 ( A != B
),根据awk
实现的不同,它可以是字节到字节的比较,或者对于某些(根据 POSIX 的要求),它是 的缩写A < B || A > B
,即A != B
测试A
和B
的排序是否不同。
无论如何,它都不是模式匹配运算符。为此,您有~
运算符(用 取反!~
),尽管这是用于正则表达式匹配,而不是通配符模式匹配。你需要:
ls -la | awk '$1 !~ /^d/'
虽然在这里,你也可以使用:
ls -la | grep -v '^d'
有了$1 != "d*"
,就会返回真的对于除第一个字段之外的任何内容(或与某些实现的排序相同awk
)d*
。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
.