我想使用 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?
答案 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
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}'