2014-02-10 94 views
0

我想通過使用awk命令打印目錄。我不希望打印的當前和父目錄,所以我已經創建了一個合適的正則表達式匹配:如何使用awk命令僅打印目錄

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

代碼工作正常,但我想,使其更具可讀性,就像這樣:

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

不幸的是,第二場比賽不起作用。

它應該如何定義匹配一個或兩個 s?

+0

爲什麼不乾脆使用'ls -lA'將會排除'.'和'..'的條目? – larsks

+0

是的,使用迄今爲止已經實現的命令但是你必須知道它們總是更好......謝謝你的迴應。我會利用你的建議,但我仍然想知道如何正確定義我的正則表達式來實現它的目標。 – Dominik

+0

都適用於我 – michaeltang

回答

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」的別名爲「LS -lF」這意味着當前目錄被列爲「./」,而父目錄是「../」,因爲'/'被錨定在行的末尾('$'),所以它無法匹配正則表達式正則表達式)。我想知道你是否有類似的問題。

+0

ls -lF的組合也失敗了。 – Dominik

0

你運行Solaris中的awk命令,請更換由/usr/xpg4/bin/awk

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

我正在使用Ubuntu。 – Dominik

0

你的第二個示例awk不工作,因爲舊的AWK(非GNU)AWK版本不支持像正則表達式號碼模式這個:

/\.{1,2}/ 

然而,只是爲了得到目錄列表你不應該分析ls的輸出。

編輯:要打印隱藏目錄,但要避免...使用本:

您可以使用:

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

記住文件/在他們換行符目錄名稱是有問題的。

+0

從命令awk --version,我知道我使用GNU Awk 3.1.8,所以根據您的信息,一切都應該正常工作:) 您的第二個提示與隱藏的目錄不匹配:/ – Dominik

+0

查看更新的答案或其他試試:'printf'%s \ n「* /。* /'也可以打印隱藏目錄。 – anubhava

+0

但是使用'printf'%s \ n「* /。* /'會打印」。「和「..」目錄,我想避免的。 – Dominik

0

您可以使用以下,其中不包括鷹,但效果很好:

ls -ld */ 

甚至更​​好

ls -1 -d */ 
+0

該命令也不匹配隱藏的目錄:/ – Dominik

0

只要把astarisk *

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