2015-04-15 50 views
2

你好,並提前感謝您的答案。

當我使用下面的代碼,我得到的輸出,如:使用管道時的字符串操作的基本名稱

/home/pony/IOSO/test/A 
    /home/pony/IOSO/test/B 


FILE=last.cfg 
DIR=$(realpath "$2") #or something else  
grep $DIR $FILE | awk '{ print $2 }' | sort | uniq # | basename does not work 

如何使我的基本名稱或東西管的工作是這樣的:

$ s=/the/path/foo.txt 
$ echo ${s##*/} 
foo.txt 
+1

嘗試'grep $ DIR $ FILE | awk'{print $ 2}'|排序| uniq | sed's〜。*/~~'' –

+0

這樣做!謝謝。不知道如何選擇你作爲正確的答案,因爲我剛加入。 – user3473750

回答

1

你可以做到這一點使用awk,這樣就可以避免grepawksed sequance的不必要使用

正確的方法可以

awk -v dir="$DIR" -F"/" '$0 ~ dir{print $NF}' 

測試

$ DIR="/home/pony/IOSO/test" 

$ cat input 
/home/pony/IOSO/test/A 
/home/pony/IOSO/test/B 
/home/test/test 

$ awk -v dir="$DIR" -F"/" '$0 ~ dir{print $NF}' input 
A 
B 

它能做什麼

  • -v dir="$DIR"創建了shell變量的值DIR

  • -F"/"設置字段分隔符爲/awk變量。這是在輸入文件中完成的,目錄由/分開,我們需要獲取最後一個字段,即文件名。

  • '$0 ~ dir檢查對於每個輸入線路,如果它在可變dir

  • print $NF打印的最後一個字段,這裏的文件名中的模式匹配。 NF代表字段數。

+0

你的解決方案可能要快得多,但我想避免我還沒有完全理解的代碼序列。你肯定讓我在本週末瀏覽了awk的manpage。 – user3473750

+1

@ user3473750我爲您添加了一些小說明。希望它現在可以幫助你:) – nu11p01n73R

+0

我的$ FILE在哪裏去? awk -v dir =「$ DIR」-F「/」'$ 0〜dir {print $ NF}'$ FILE ??? – user3473750

1

只需通過uniq命令的輸出到如下所示的sed命令,以刪除最後一個/符號的所有字符。

grep $DIR $FILE | awk '{ print $2 }' | sort | uniq | sed 's~.*/~~'