• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

awk: Rest einer Zeile ausgeben?

abgdf

Guru
Hallo,

gibt es einen einfachen Weg, in awk bei einem split an Leerzeichen ab einer bestimmten Stelle den ganzen Rest der Zeile auszugeben?

Also angenommen ich habe
Code:
#!/bin/bash
a="ALL ALL BOTH /home/user/a new directory/more"
echo $a | awk '{print $4}'
dann bekomme ich nicht das ganze Verzeichnis am Ende, weil wieder am Leerzeichen abgebrochen wird. Gibt's da eine Lösung?

Gruß
 
OP
A

abgdf

Guru
Hmm, hab' dann doch mal Perl bemüht:
Code:
#!/bin/bash
a="ALL ALL BOTH /home/user/a new directory/more"
echo $a | awk '{print $4}'
echo "$a" | perl -e '@a=split(" ",<>);for(1..3){shift(@a)}print join(" ",@a)."\n";'
Würd' mich aber immer noch interessieren, wie das in awk geht ...

Gruß
 

}-Tux-{

Hacker
Wenn schon perl, warum dann nicht gleich "richtig"? :)
Code:
#!/usr/bin/perl
use strict;
use warnings;
my $a = "ALL ALL BOTH /home/user/a new directory/more";
$a =~ /(?:\w*\s){3}(.*)/;
print "$1\n";

}-Tux-{
 
A

Anonymous

Gast
abgdf schrieb:
gibt es einen einfachen Weg, in awk bei einem split an Leerzeichen ab einer bestimmten Stelle den ganzen Rest der Zeile auszugeben?
eine einfache Lösung ehr weniger, aber Lösungen schon. ZB über die Anzahl der Felder zB
Code:
echo $a | awk '{for (i=4;i<=NF;i++) printf ("%s ", $i); print "" }'
Der Nachteil hier bei awk allgemein: stehen mehrere Leerzeichen hintereinander wird daraus immer nur eines gemacht, und ein mögliches weiteres Problem bei dieser speziellen Lösung oben: am Ende ist immer ein Leerzeichen zuviel, was eventuell Auswirkungen in bestimmten Situationen haben wird. Man könnte zwar versuchen hier am Ende statt print "" also NICHTS ein BACKSPACE auszugeben, aber das ist auch nur eine Krücke.

Der andere Weg währe wirklich aus der Gesamtzeile die ersten Felder gezielt abzuschneiden, und nur den Rest auszugeben.
Aber selbst das ist in AWk nicht besonders komfortabel zu machen. Besser geht sowas mit sed
Code:
echo $a | sed 's/^\([^ ]* \)\{3\}//'
oder noch einfacher mit cut ;)
Code:
echo $a | cut -d" " -f4-

robi
 
Oben