2013-07-29 58 views
50

我有一個簡單的需求,如下所示:
正在獲取絕對目錄的文件名。
例如/home/parent/child/filename
我的要求是從此剪下文件名。
我曾嘗試是:使用awk substr獲取最後一個字段

awk -F "/" '{print $5}' input 

它完美的作品。
但在這裏我硬編碼$5如果我輸入的是有如下的結構可能會有所不同:

/home/parent/child1/child2/filename 

所以它應該是沒有硬編碼的動態。這是邏輯:
總是採取最後一個字段,這將是文件名(所以需要從背面檢查)。

任何人都可以幫助我與awk substr函數或任何其他功能?

+1

正如有人指出使用'basename'是這樣做的官方方式,使用'awk'這是不好的,把它放在一邊。 :D – Kashyap

回答

117

使用awk基於字段分隔符分割字段中的行的事實,您可以定義該字段分隔符。因此,定義字段分隔符/你可以說:

awk -F "/" '{print $NF}' input 

NF指當前記錄的字段數,印刷$NF意味着打印最後一個。

所以給出一個文件是這樣的:

/home/parent/child1/child2/child3/filename 
/home/parent/child1/child2/filename 
/home/parent/child1/filename 

這將是輸出:

$ awk -F"/" '{print $NF}' file 
filename 
filename 
filename 
+2

它工作完美。我沒有想到$ NF變量。感謝您的直接簡單而有效的答案。 – Mari

+0

@Nullpointer不知道你在這裏問什麼。可能最好[問一個新問題](/問題/問)與更多細節。 – fedorqui

20

在這種情況下,最好使用basename而不是awk

$ basename /home/parent/child1/child2/filename 
filename 
+0

用於basename命令。簡單地完成這項工作。 – Mari

+3

@Mari * F.Y.I *'dirname'會做相反的事情,而不是路徑。 –

4

另一種選擇是使用bashparameter substitution

$ foo="/home/parent/child/filename" 
$ echo ${foo##*/} 
filename 
$ foo="/home/parent/child/child2/filename" 
$ echo ${foo##*/} 
filename 
-1

您還可以使用:

sed -n 's/.*\/\([^\/]\{1,\}\)$/\1/p' 

sed -n 's/.*\/\([^\/]*\)$/\1/p' 
+0

在這一點上沒有人贊成這個答案,可能是因爲它相當難看:) –

4

如果你打開一個Perl的解決方案,在這裏一個類似fedorqui的awk的解決方案:

perl -F/ -lane 'print $F[-1]' input 

-F/指定/作爲字段分隔
$F[-1]@F自動分割陣列

+0

謝謝。這幫助我得到了最後一個領域。 perl -F「/」-lane「print $ F [-2]'輸入 – riderchap

2

這應該是基本名稱答案評論中最後一個元素,但我沒有足夠的點。

如果不使用雙引號,basename不會路徑,這裏的空間性格的工作:

$ basename /home/foo/bar foo/bar.png 
bar 

確定用引號 「」

$ basename "/home/foo/bar foo/bar.png" 
bar.png 

文件示例

$ cat a 
/home/parent/child 1/child 2/child 3/filename1 
/home/parent/child 1/child2/filename2 
/home/parent/child1/filename3 

$ while read b ; do basename "$b" ; done < a 
filename1 
filename2 
filename3 
3

我知道我就這麼晚了3年,但是...... 你應該考慮參數擴展,它是內置的和更快的。

如果你的輸入是在一個變種,比方說,$ var1,只是做${var1##*/}。看下面

$ var1='/home/parent/child1/filename' 
$ echo ${var1##*/} 
filename 
$ var1='/home/parent/child1/child2/filename' 
$ echo ${var1##*/} 
filename 
$ var1='/home/parent/child1/child2/child3/filename' 
$ echo ${var1##*/} 
filename 
相關問題