【问题标题】:awk split questionawk 拆分问题
【发布时间】:2011-06-13 20:18:49
【问题描述】:

我写了一个小脚本,使用 awk 'split' 命令获取当前目录名。

回显 $PWD

由于拆分操作,我需要将“8”替换为令牌数。 // 如果密码 = /home/username/bin.我正在尝试将“bin”放入包中。

package="`echo $PWD | awk '{split($0,a,"/"); print a[8] }'`" 
echo $package 

您能告诉我用什么代替“print a[8]”来让脚本适用于任何目录路径吗?

-萨钦

【问题讨论】:

    标签: awk split


    【解决方案1】:

    你不需要 awk。如果您总是想要路径中的最后一个目录,请执行以下操作:

    #!/bin/sh
    
    cur_dir="${PWD##*/}/"
    echo "$cur_dir"
    

    上述内容的额外好处是不会为外部二进制文件创建任何子外壳和/或分叉。都是原生的 POSIX shell 语法。

    【讨论】:

    • 试试:$ cd /; echo ${PWD##*/}
    • basename $(dirname $PWD)
    • @Tomasz 很公平。一个简单的 '/' 的附加就应该清楚了。
    • @dmckee:这不是其他可能解决方案的建议,而是 SegeX 解决方案将失败的用例;另一方面,您的解决方案将打印 $PWD 的父目录名称,如果目录名称包含空格,则会失败
    • @dmckee 您刚刚分叉了 3 个进程来完成与 shell 可以在本地完成的相同的事情。实际上,Tomasz 是对的,但这不是一回事,basename "$PWD" 是。尽管如此,一个多余的叉子。
    【解决方案2】:

    您可以使用print a[length(a)],但最好避免拆分并使用自定义字段分隔符和$NF

    echo $PWD | awk -F/ '{print $NF}'
    

    但在这种特定情况下,您应该使用basename

    basename "$PWD"
    

    【讨论】:

      【解决方案3】:

      其他答案是执行您尝试完成的功能的更好替代品。但是,这是您问题的具体答案:

      package=$(echo $PWD | awk '{n = split($0,a,"/"); print a[n] }')
      echo "$package"
      

      split() 返回结果元素的数量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-12
        • 1970-01-01
        • 2013-06-07
        相关资源
        最近更新 更多