【问题标题】:Parsing and Printing $PATH Using Unix使用 Unix 解析和打印 $PATH
【发布时间】:2012-10-14 00:07:53
【问题描述】:

我已将我的 PATH 放在一个文本文件中,并希望在 UNIX 中使用一个简单的命令将每个路径打印在换行符上。

我已经找到了很长的路要走,就像这样......

cat Path.txt | awk -F\; '{print $1"\n", $2"\n", ... }'

但这似乎效率低下,所以我知道必须有一种方法可以在每次换行时快速打印出我的结果,而不必手动调用由分隔符分隔的每个字段。

【问题讨论】:

  • Unix 上的路径分隔符是冒号:,而不是问题中awk 命令中设置的分号;。

标签: parsing unix path awk


【解决方案1】:

另一种方式:

echo $PATH | tr : '\n'

或:

tr : '\n' <Path.txt

【讨论】:

  • 由于我一直在抨击其他人的 bashism,我觉得我必须指出一些系统提供了一个不理解 '\n' 的 tr。不过,“”有效。
  • 如果其他人想知道:PATH 条目不允许包含冒号。 IE。没有转义机制:stackoverflow.com/a/29213487/1517969
【解决方案2】:

tr 解决方案是正确的,但如果您要使用 awk,则不需要循环:

$ echo "$PATH"
/usr/local/bin:/usr/bin:/cygdrive/c/winnt/system32:/cygdrive/c/winnt

$ echo "$PATH" | awk -F: -v OFS="\n" '$1=$1'
/usr/local/bin
/usr/bin
/cygdrive/c/winnt/system32
/cygdrive/c/winnt

【讨论】:

  • 只是提到 gawk 和 mawk 有原生的 windows 二进制文件,与 cmd.exe 配合得很好,干杯!
  • 以上评论中的OFS是什么意思?
  • 这是输出字段分隔符。我告诉 awk 获取一个由冒号分隔的列表字段(FS = 输入字段分隔符)并打印它们以换行符分隔(OFS = 输出字段分隔符)。
【解决方案3】:

我有一个用于此目的的 Perl 脚本:

#!/usr/bin/env perl
#
#   "@(#)$Id: echopath.pl,v 1.8 2011/08/22 22:15:53 jleffler Exp $"
#
#   Print the components of a PATH variable one per line.
#   If there are no colons in the arguments, assume that they are
#   the names of environment variables.

use strict;
use warnings;

@ARGV = $ENV{PATH} unless @ARGV;

foreach my $arg (@ARGV)
{
    my $var = $arg;
    $var = $ENV{$arg} if $arg =~ /^[A-Za-z_][A-Za-z_0-9]*$/;
    $var = $arg unless $var;
    my @lst = split /:/, $var;
    foreach my $val (@lst)
    {
        print "$val\n";
    }
}

我像这样调用它:

echopath $PATH
echopath PATH
echopath LD_LIBRARY_PATH
echopath CDPATH
echopath MANPATH
echopath $CLASSPATH

等等。可以指定变量名,或者变量的值;它是双向的。

【讨论】:

    【解决方案4】:

    Perl 用于 UNIX/UNIX 类:

    echo $PATH | perl -F: -ane '{print join "\n", @F}'
    

    使用任何操作系统(在 Windows XP、Linux、Minix、Solaris 上测试):

    my $sep;
    my $path;
    
    if ($^O =~ /^MS/) {
        $sep = ";";
        $path = "Path";
    }
    else {
         $sep = ":";
         $path = "PATH";
    }
    
    print join "\n", split $sep, $ENV{$path} . "\n";
    

    如果在 Unix 上使用 ,请尝试以下代码:

    printf '%s\n' ${PATH//:/ }
    

    这个用bashparameter expansion

    【讨论】:

    • shell 的唯一优点是它的极端便携性。如果你不能只使用 Unix98 中存在的工具在 shell 中做某事,那么你最好切换到真正的编程语言而不是使用不可移植的 shell 扩展。
    • @Zack,如果您需要可移植性,请停止使用 shell,并尝试使用 python、ruby 或 perl。
    • 但这正是我的观点!当您需要一个不可移植的 shell 功能时,就是停止使用 shell 的时刻!
    • 添加了另一个 Perl 解决方案。
    【解决方案5】:

    awk:

    echo $PATH|awk -F: '{gsub(/:/,"\n");print}'
    

    perl:

    echo $PATH|perl -F: -lane 'foreach(@F){print $_}'
    

    【讨论】:

      【解决方案6】:

      对于 AWK,除了:

      echo $PATH | awk -vFS=':' -vOFS='\n' '$1=$1'
      

      你可以:

      echo $PATH | awk -vRS=':' '1'
      

      【讨论】:

        猜你喜欢
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-27
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多