2012-10-23 9 views
7

Umieściłem moją ścieżkę PATH w pliku tekstowym i chciałbym wydrukować każdą ścieżkę na linii nowej za pomocą prostego polecenia w systemie UNIX.

Znalazłem długą drogę, aby to zrobić, że idzie tak ...

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

jednak wydaje się to nieskuteczne, więc wiem, że musi być jakiś sposób, aby szybko wydrukować moje wyniki na nowych liniach każdego czas bez konieczności ręcznego wywoływania każdego pola oddzielonego separatorem.

+4

Separator ścieżka na Uniksie jest dwukropek ':' a nie średnik ';' jak ustawić w 'awk' polecenia w pytaniu. –

Odpowiedz

16

Jeszcze innym sposobem:

echo $PATH | tr : '\n' 

czyli

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

Od czasu, gdy szarpiąłem innych ludzi za bashisms, czuję, że muszę zwrócić uwagę, że niektóre systemy wysyłają 'tr', które nie rozumieją \ n''. "" działa. – zwol

+0

W przypadku, gdy ktoś inny zastanawia się: wpisy PATH nie mogą zawierać dwukropków. To znaczy. nie ma mechanizmu ucieczki: http://stackoverflow.com/a/29213487/1517969 – olejorgenb

0

Z Perl dla Unix/UNIX Lubi:

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

z wszelkimi systemami operacyjnymi (testowane na systemach 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"; 

przypadku korzystania dla Unix, spróbuj następujący kod:

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

To wykorzystanie bashparameter expansion

+0

Jedyną zaletą powłoki jest jej wyjątkowa przenośność. Jeśli nie możesz zrobić czegoś w powłoce, korzystając tylko z udogodnień, które istniały w Unix98, lepiej jest przejść na prawdziwy język programowania niż przy użyciu nieprzewidywalnych rozszerzeń powłoki. – zwol

+0

@Zack, jeśli potrzebujesz przenośności, przestań używać powłoki i spróbuj python, ruby ​​lub perl. –

+0

Ale to jest właśnie mój punkt widzenia! Chwila, w której potrzebujesz nieprzenośnej funkcji powłoki, to moment, aby przestać używać powłoki! – zwol

0

Mam skrypt Perl, który używam do tego:

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

przywołuję to lubią:

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

itd. Można podać nazwę zmiennej lub wartość zmiennej; działa w obie strony.

2

Rozwiązanie tr jest słuszna, ale jeśli były zamiar użyć awk wtedy nie byłoby potrzeby pętli:

$ 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

Wystarczy wspomnieć, że gawk i mawk mają natywne binarne okna, działa dobrze z cmd.exe, okrzyki! – MeaCulpa

+0

co oznacza OFS w powyższym komentarzu? – Nick

+0

To separator pola wyjściowego. Mówię do awk, aby wybrał pola listy oddzielone dwukropkami (FS = Input Field Separator) i wydrukuj je oddzielone znakami nowej linii (OFS = Output Field Separator). –

0

awk:

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

Perl:

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

dla AWK, oprócz:

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

Można:

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