使用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'