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

Mar*_*ari 84 unix awk substr

我有一个简单的要求如下,
我得到绝对目录的文件名.
例如,/home/parent/child/filename
我的要求是从中删除文件名.
我试过的是:

awk -F "/" '{print $5}' input
Run Code Online (Sandbox Code Playgroud)

哪作得很好.
但是$5,如果我的输入具有如下结构,那么硬编码可能会有所不同:

/home/parent/child1/child2/filename
Run Code Online (Sandbox Code Playgroud)

所以它应该是动态的,没有硬编码.这是逻辑:
始终采用最后一个将是文件名的字段(因此需要从反向检查).

任何人都可以帮我解决awk substr函数或任何其他函数?

fed*_*qui 182

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

awk -F "/" '{print $NF}' input
Run Code Online (Sandbox Code Playgroud)

NF涉及当前记录的字段数时,打印$NF意味着打印最后一个记录.

所以给出这样的文件:

/home/parent/child1/child2/child3/filename
/home/parent/child1/child2/filename
/home/parent/child1/filename
Run Code Online (Sandbox Code Playgroud)

这将是输出:

$ awk -F"/" '{print $NF}' file
filename
filename
filename
Run Code Online (Sandbox Code Playgroud)

  • 它完美地运作.我没想到$ NF变量.感谢您的简单而有效的答案. (2认同)
  • 对于倒数第二个,使用`$(NF-1)`。 (2认同)

pio*_*kuc 30

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

 $ basename /home/parent/child1/child2/filename
 filename
Run Code Online (Sandbox Code Playgroud)

  • @Mari*FYI*`dirname`执行相反的操作并剥离文件而不是路径. (4认同)

dev*_*ull 5

另一种选择是使用bash 参数替换.

$ foo="/home/parent/child/filename"
$ echo ${foo##*/}
filename
$ foo="/home/parent/child/child2/filename"
$ echo ${foo##*/}
filename
Run Code Online (Sandbox Code Playgroud)


Chr*_*nat 5

如果你对Perl解决方案持开放态度,这里有一个类似于fedorqui的awk解决方案:

perl -F/ -lane 'print $F[-1]' input
Run Code Online (Sandbox Code Playgroud)

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


Nic*_*yre 5

就像晚了 5 年一样,我知道,感谢所有的建议,我过去是按以下方式这样做的:

$ echo /home/parent/child1/child2/filename | rev | cut -d '/' -f1 | rev
filename
Run Code Online (Sandbox Code Playgroud)

很高兴注意到有更好的礼仪