如何使用awk命令仅打印目录

时间:2014-02-10 02:20:04

标签: regex bash awk getdirectories

我想使用 awk 命令仅打印目录。我不想打印当前和父目录,所以我创建了一个适当的正则表达式匹配:

ls -la | awk '$1 ~ /[d].*/ && $9 !~ /^\.$/ && $9 !~ /^\.\.$/   { print $1"\t"$9 } '

代码工作正常,但我想让它更具可读性,如下所示:

ls -la | awk '$1 ~ /[d].*/ && $9 !~ /^\.{1,2}$/    { print $1"\t"$9 } '

不幸的是,第二场比赛不起作用。

如何定义匹配一个或两个 dot s?

5 个答案:

答案 0 :(得分:0)

你的第二个例子对我来说很合适:

$ /bin/ls -la | awk '$1 ~ /[d].*/ && $9 !~ /^\.{1,2}$/ {print $1"\t"$9}'
drwxr-xr-x  .git
drwxr-xr-x  .idea
drwxr-xr-x  data
drwxr-xr-x  src

当我第一次看它时,它对我来说不起作用,因为我对'ls -lF'有'ls'别名,这意味着当前目录被列为“./”和父是“../”,它与正则表达式无法匹配,因为'/'锚定在行的末尾(正则表达式中的'$')。我想知道你是否有类似的问题。

答案 1 :(得分:0)

您是否在Solaris中运行awk命令,请用/usr/xpg4/bin/awk

替换awk
ls -la | /usr/xpg4/bin/awk '$1 ~ /[d].*/ && $9 !~ /^\.{1,2}$/ {print $1"\t"$9}'

答案 2 :(得分:0)

您的第二个示例不起作用,因为较旧的awk(非gnu)awk版本不支持这样的正则表达式编号模式:

/\.{1,2}/

然而,只是为了获取目录列表,你不应该解析ls的输出。

编辑:要打印隐藏目录,请避免使用...

您可以使用:

printf "%s\n" */ .*[!.]*/

请记住文件/目录名称中包含换行符存在问题。

答案 3 :(得分:0)

您可以使用以下内容,但不包括鹰派,但效果很好:

ls -ld */

甚至更好

ls -1 -d */

答案 4 :(得分:0)

只是放一个astarisk *

ls -la | awk '$1 ~ /[d].*/ && $9 !~ /^\.*$/ {print $1"\t"$9}'