awk: 从完整路径中提取文件名

3

我有一个类似这样的文件列表:

-rw-r--r--   3 knsdkls users  336207616 2014-11-10 07:15 /hive/some/thing/path/location/data/plants/zombies/Filename.txt

从中,我想提取文件大小和文件名。
我尝试了awk:
awk '{print $5,$NF}'

这将导致:

336207616  /hive/some/thing/path/location/data/plants/zombies/Filename.txt

I would like:

336207616  Filename.txt

请指导我。 另外,文件路径中的子目录数量是不固定的。 谢谢。
3个回答

4
通过 awk 的 split 函数。
$ awk '{n=split($NF,a,"/");print $5,a[n]}' file
336207616 Filename.txt

说明:

  • split($NF,a,"/")将最后一个字段根据分隔符/分割,并将分割的部分存储到数组a中。分割的总数存储在一个名为n的变量中。因此,在这种情况下,变量n包含10

  • print $5,a[n]这会打印第五个字段和存储在数组a中的最后一个元素。


3
这应该可以做到:
awk -F" +|/" '{print $5,$NF}'
336207616 Filename.txt

只需添加 / 作为分隔符即可。

@FenderBender 它只是将分隔符更改为 "+" 一个或多个空格和 /。然后,这将使用空格或斜杠来划分所有字段。最后一个字段将在最后一个 / 之后。您可以像这样添加许多分隔符 -F"a|g| "(a、g或空格),或像这样 -F"[ag ]" - Jotne
有一件事需要记住:只有在没有其他字段包含斜杠的情况下才能正常工作——在这种情况下应该是成立的。 - ua2b
@ua2b 我知道。而且由于它是一个目录列表,它不会在其他地方有斜杠(不在所有者或组中)。 - Jotne
@Jotne 我只是想防止其他人掉进这个陷阱。否则,我认为这是解决这个问题最优雅的方法。 - ua2b

0
你可以使用 `gsub` 函数。
$ awk '{gsub(/.*\//, "", $NF); print $5,$NF}' input
336207616 Filename.txt
  • gsub(/.*\//, "", $NF) 将从/开始的任何字符,.* 替换为空字符串""

  • print $5,$NF 打印第五个和最后一个字段


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接