使用awk substr获取最后一个字段

我有一个简单的要求如下,
获取绝对目录的文件名。
例如/home/parent/child/filename
我的要求是从这个剪切文件名。
我所尝试的是:

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

这完美的作品。
但是这里的硬编码是$5 ,如果我的input结构如下所示,这可能会有所不同:

 /home/parent/child1/child2/filename 

所以它应该是dynamic的,没有硬编码。 这是逻辑:
总是把最后一个字段作为文件名(所以需要从后面检查)。

任何人都可以帮助我与awk substrfunction或任何其他function?

使用awk根据字段分隔符分割字段中的行的事实,您可以定义。 因此,定义字段分隔符可以说:

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

由于NF是指当前logging的字段数,打印$NF表示打印最后一个logging。

所以给一个这样的文件:

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

这将是输出:

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

在这种情况下,最好使用basename而不是awk

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

如果你打开一个Perl解决scheme,这里类似于fedorqui的awk解决scheme:

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

-F/指定/作为字段分隔符
$F[-1]@F autosplit数组中的最后一个元素

另一个select是使用bash 参数replace 。

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

这应该是一个基本的答案评论,但我没有足够的观点。

如果你不使用双引号,那么basename将不会与有空格字符的path一起工作:

 $ 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年,但是……你应该考虑参数扩展,它是内置的,更快。

如果你的input是在一个变种,让我们说,$ 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 

你也可以使用:

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

要么

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