2012-10-23 8 views
7

Ich habe meinen PATH in eine Textdatei geschrieben und möchte jeden Pfad auf einer neuen Zeile mit einem einfachen Befehl in UNIX drucken.

ich einen langen Weg gefunden haben, es zu tun, das so geht ...

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

Dies scheint jedoch ineffizient, so weiß ich es eine Möglichkeit sein muss, schnell auf meine Ergebnisse auszudrucken neue Linien je Zeit, ohne jedes durch das Trennzeichen getrennte Feld manuell aufrufen zu müssen.

+4

Der Pfadseparator auf Unix ist Kolon ':' und nicht Semikolon ';' wie im 'awk' Befehl in der Frage festgelegt. –

Antwort

16

Noch eine andere Art und Weise:

echo $PATH | tr : '\n' 

oder:

tr : '\n' <Path.txt 
+0

Da ich wegen Bashisms auf andere Leute losgeprügelt habe, muss ich darauf hinweisen, dass einige Systeme einen 'tr' liefern, der' 'n'' nicht versteht. "" funktioniert jedoch. – zwol

+0

Falls jemand anderes sich wundert: PATH-Einträge dürfen keine Doppelpunkte enthalten. Ie. Es gibt keinen Escape-Mechanismus: http://StackOverflow.com/A/29213487/1517969 – olejorgenb

0

Mit Perl für UNIX/UNIX-likes:

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

Mit allen OSes (getestet auf 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"; 

Wenn für Unix verwenden, versuchen Sie Mit dem folgenden Code:

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

Diese Verwendung bashparameter expansion

+0

Die einzige Tugend der Schale ist ihre extreme Portabilität. Wenn Sie in der Shell nicht nur mit den in Unix98 vorhandenen Funktionen etwas tun können, wechseln Sie besser in eine echte Programmiersprache, als wenn Sie unportable Shell-Erweiterungen verwenden. – zwol

+0

@Zack, wenn Sie Portabilität benötigen, beenden Sie die Shell, und versuchen Sie es mit Python, Ruby oder Perl. –

+0

Aber das ist genau mein Punkt! In dem Moment, in dem Sie eine nicht portierbare Shell-Funktion benötigen, ist der Moment gekommen, die Shell nicht mehr zu benutzen! – zwol

0

Ich habe ein Perl-Skript, das ich für diesen Einsatz:

#!/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"; 
    } 
} 

rufe ich es mag:

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

usw. Sie können den Variablennamen oder den Wert der Variablen angeben; es funktioniert in beide Richtungen.

2

Die tr-Lösung ist die richtige, aber wenn Sie awk verwenden würden, dann würde es keine Notwendigkeit für eine Schleife sein:

$ 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 
+0

Nur um zu erwähnen, gawk und mawk haben native Windows binary, gut mit cmd.exe, Prost! – MeaCulpa

+0

Was bedeutet der OFS im obigen Kommentar? – Nick

+0

Es ist der Output Field Separator. Ich sage awk, dass ich Listenfelder getrennt durch Doppelpunkte (FS = Input Field Separator) nehme und sie stattdessen durch Zeilenumbrüche (OFS = Output Field Separator) getrennt drucke. –

0

awk:

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

Perl:

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

für AWK, zusätzlich zu:

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

Sie können:

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