【问题标题】:awk: Extracting file name from full pathawk:从完整路径中提取文件名
【发布时间】:2015-01-21 19:47:50
【问题描述】:

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

-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

我想要:

336207616  Filename.txt

请指导我。 此外,文件路径中子目录的数量也不是恒定的。

谢谢。

【问题讨论】:

    标签: bash shell awk scripting


    【解决方案1】:

    通过 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

    【讨论】:

      【解决方案2】:

      应该这样做:

      awk -F" +|/" '{print $5,$NF}'
      336207616 Filename.txt
      

      只需添加/ 作为分隔符。

      【讨论】:

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

      你可以使用gsub函数

      $ awk '{gsub(/.*\//, "", $NF); print $5,$NF}' input
      336207616 Filename.txt
      
      • gsub(/.*\//, "", $NF) 替换任何内容,.* 直到 / 带有空字符串 ""

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-16
        • 1970-01-01
        • 2018-04-21
        • 2011-04-13
        • 2012-01-11
        • 1970-01-01
        相关资源
        最近更新 更多