Verwenden Sie awk, um alle Spalten vom n-ten bis zum letzten zu drucken

310

Diese Zeile funktionierte, bis ich im zweiten Feld Leerzeichen hatte.

svn status | grep '\!' | gawk '{print $2;}' > removedProjs

Gibt es eine Möglichkeit, awk alles in $ 2 oder höher drucken zu lassen? ($ 3, $ 4 .. bis wir keine Spalten mehr haben?)

Ich sollte wohl hinzufügen, dass ich dies in einer Windows-Umgebung mit Cygwin mache.

Andy
quelle
11
Abgesehen davon ist das grep | awkein Antimuster - Sie wollenawk '/!/ { print $2 }'
Tripleee
3
Unix "schneiden" ist einfacher ...svn status | grep '\!' | cut -d' ' -f2- > removedProjs
Roblogic
Mögliches Duplikat des Drucks der restlichen Felder in awk
acm
@tripleee: Ich bin so froh, dass du das erwähnt hast - ich bin frustriert, es überall zu sehen!
Graham Nicholls

Antworten:

490

druckt alle bis auf die erste Spalte:

awk '{$1=""; print $0}' somefile

druckt alle bis auf zwei erste Spalten:

awk '{$1=$2=""; print $0}' somefile
zed_0xff
quelle
93
gotcha: lässt einen führenden Raum baumeln über :(
raphinesse
5
Ich mag den pragmatischen Ansatz. Es ist jedoch nicht erforderlich, cat zu verwenden. Geben Sie einfach den Dateinamen nach dem Befehl awk ein.
Kon
45
@raphinesse können Sie das mitawk '{$1=""; print substr($0,2)}' input_filename > output_filename
themiurgo
6
Dies funktioniert nicht mit Nicht-Leerzeichen-Trennzeichen, sondern ersetzt sie durch ein Leerzeichen.
Dejan
3
Für Nicht-Leerzeichen-Trennzeichen können Sie das Ausgabefeld-Trennzeichen (OFS) angeben, z. B. durch ein Komma: awk -F, -vOFS=, '{$1=""; print $0}'Sie erhalten ein anfängliches Trennzeichen ( $1ist immer noch enthalten, nur als leere Zeichenfolge). Sie können das aber mit abstreifen sed:awk -F, -vOFS=, '{$1=""; print $0}' | sed 's/^,//'
cherdt
99

Es gibt eine doppelte Frage mit einer einfacheren Antwort unter Verwendung von cut:

 svn status |  grep '\!' | cut -d\  -f2-

-dGibt den Begrenzer (Leerzeichen) an , -fgibt die Liste der Spalten an (alle beginnend mit dem 2.)

Joshua Goldberg
quelle
Sie können auch "-b" verwenden, um die Position anzugeben (ab dem N-ten Zeichen).
Dakatine
Obwohl dies die gleiche Aufgabe wie die awkVersion ausführt , gibt es Probleme mit cutder Zeilenpufferung , die awknicht auftreten: stackoverflow.com/questions/14360640/…
sdaau
24
Schön und einfach, aber mit einer Einschränkung verbunden: awkBehandelt mehrere benachbarte Raumzeichen. als einzelnes Trennzeichen, während cutdies nicht der Fall ist; auch - obwohl dies im vorliegenden Fall kein Problem ist - cutakzeptiert nur ein einziges wörtliches Zeichen. als Trennzeichen, während awkeine Regex erlaubt.
mklement0
Basierend darauf: stackoverflow.com/a/39217130/8852408 ist es wahrscheinlich, dass diese Lösung nicht sehr effizient ist.
FcknGioconda
85

Sie können eine for-Schleife verwenden, um die Druckfelder $ 2 bis $ NF (integrierte Variable, die die Anzahl der Felder in der Zeile darstellt) zu durchlaufen.

Bearbeiten: Da "Drucken" eine neue Zeile anfügt, möchten Sie die Ergebnisse puffern:

awk '{out=""; for(i=2;i<=NF;i++){out=out" "$i}; print out}'

Alternativ können Sie printf verwenden:

awk '{for(i=2;i<=NF;i++){printf "%s ", $i}; printf "\n"}'
VeeArr
quelle
Also habe ich es versucht, aber ich glaube, ich vermisse etwas. Hier ist, was ich getan habe grep '\!' | gawk '{for (i = 1; i <= $ NF; i ++) print $ i "";}'> removeProjs
Andy
Da beim Drucken eine neue Zeile angehängt wird, möchten Sie die Ergebnisse puffern. Siehe meine Bearbeitung.
VeeArr
1
Diese Antwort gefällt mir besser, weil sie zeigt, wie man Felder durchläuft.
Edward Falk
3
Wenn der Druck ein Leerzeichen verwenden soll, ändern Sie das Trennzeichen für den Ausgabedatensatz: awk '{ORS = ""; für (i = 2; i <NF; i ++) print $ i} 'somefile
Christian Lescuyer
3
Es wird immer einige Räume zu viel geben. Dies funktioniert besser: '{for(i=11;i<=NF-1;i++){printf "%s ", $i}; print $NF;}'Keine führenden oder nachfolgenden Leerzeichen.
Marki
24
awk '{out=$2; for(i=3;i<=NF;i++){out=out" "$i}; print out}'

Meine Antwort basiert auf der von VeeArr , aber ich habe festgestellt, dass sie mit einem Leerzeichen begann, bevor die zweite Spalte (und der Rest) gedruckt wurde. Da ich nur einen Reputationspunkt habe, kann ich ihn nicht kommentieren. Hier ist eine neue Antwort:

Beginnen Sie mit "out" als zweiter Spalte und fügen Sie dann alle anderen Spalten hinzu (falls vorhanden). Dies geht gut, solange es eine zweite Spalte gibt.

Wim
quelle
2
Hervorragend, auch Sie haben das $ vor der out-Variablen entfernt, was ebenfalls wichtig ist.
Alexis Wilke
15

Die meisten Lösungen mit awk lassen ein Leerzeichen. Die Optionen hier vermeiden dieses Problem.

Option 1

Eine einfache Schnittlösung (funktioniert nur mit einzelnen Trennzeichen):

command | cut -d' ' -f3-

Option 2

Wenn Sie eine awk-Neuberechnung erzwingen, entfernen Sie manchmal das hinzugefügte führende Leerzeichen (OFS), indem Sie die ersten Felder entfernen (funktioniert mit einigen Versionen von awk):

command | awk '{ $1=$2="";$0=$0;} NF=NF'

Option 3

Durch Drucken jedes mit formatierten Felds erhalten Sie printfmehr Kontrolle:

$ in='    1    2  3     4   5   6 7     8  '
$ echo "$in"|awk -v n=2 '{ for(i=n+1;i<=NF;i++) printf("%s%s",$i,i==NF?RS:OFS);}'
3 4 5 6 7 8

Alle vorherigen Antworten ändern jedoch alle wiederholten FS zwischen Feldern in OFS. Lassen Sie uns ein paar Optionen erstellen, die dies nicht tun.

Option 4 (empfohlen)

Eine Schleife mit Sub, um Felder und Trennzeichen an der Vorderseite zu entfernen.
Und mit dem Wert von FS anstelle von Leerzeichen (das geändert werden könnte).
Ist mehr tragbar und löst keine Änderung des FS zu OFS: HINWEIS: Das ^[FS]*ist eine Eingabe mit führenden Leerzeichen zu akzeptieren.

$ in='    1    2  3     4   5   6 7     8  '
$ echo "$in" | awk '{ n=2; a="^["FS"]*[^"FS"]+["FS"]+";
  for(i=1;i<=n;i++) sub( a , "" , $0 ) } 1 '
3     4   5   6 7     8

Option 5

Es ist durchaus möglich, eine Lösung zu erstellen, die keine zusätzlichen (führenden oder nachfolgenden) Leerzeichen hinzufügt und vorhandene Leerzeichen mithilfe der Funktion gensubvon GNU awk wie folgt beibehält:

$ echo '    1    2  3     4   5   6 7     8  ' |
  awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
          { print(gensub(a""b""c,"",1)); }'
3     4   5   6 7     8 

Es kann auch verwendet werden, um eine Gruppe von Feldern bei einer bestimmten Anzahl auszutauschen n:

$ echo '    1    2  3     4   5   6 7     8  ' |
  awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
          {
            d=gensub(a""b""c,"",1);
            e=gensub("^(.*)"d,"\\1",1,$0);
            print("|"d"|","!"e"!");
          }'
|3     4   5   6 7     8  | !    1    2  !

In diesem Fall wird das OFS natürlich verwendet, um beide Teile der Zeile zu trennen, und der nachfolgende Leerraum der Felder wird weiterhin gedruckt.

HINWEIS: [FS]* wird verwendet, um führende Leerzeichen in der Eingabezeile zuzulassen.

user2350426
quelle
13

Ich persönlich habe alle oben genannten Antworten ausprobiert, aber die meisten waren etwas komplex oder einfach nicht richtig. Der einfachste Weg, dies aus meiner Sicht zu tun, ist:

awk -F" " '{ for (i=4; i<=NF; i++) print $i }'
  1. Wobei -F "" das Trennzeichen definiert, das awk verwenden soll. In meinem Fall ist das Leerzeichen das Standard-Trennzeichen für awk. Dies bedeutet, dass -F "" ignoriert werden kann.

  2. Wobei NF die Gesamtzahl der Felder / Spalten definiert. Daher beginnt die Schleife vom 4. Feld bis zum letzten Feld / der letzten Spalte.

  3. Wobei $ N den Wert des N-ten Feldes abruft. Daher druckt $ i das aktuelle Feld / die aktuelle Spalte basierend auf der Anzahl der Schleifen.

koullislp
quelle
4
Problem, dass jedes Feld in einer anderen Zeile gedruckt wird.
Mveroone
nichts hält dich davon ab, dies am Ende anzuhängen :-) `| tr '\ n' '' `
koullislp
3
Ein bisschen spät, aber awk '{for (i = 5; i <= NF; i ++) {printf "% s", $ i}}'
Plitter
8
awk '{ for(i=3; i<=NF; ++i) printf $i""FS; print "" }'

lauhub schlug hier diese korrekte, einfache und schnelle lösung vor

Ajendrex
quelle
7

Das irritierte mich so sehr, dass ich mich cuthinsetzte und einen ähnlichen Feldspezifikations-Parser schrieb, der mit GNU Awk 3.1.7 getestet wurde.

Erstellen Sie zunächst ein neues Awk-Bibliotheksskript pfcutmit dem Namen z

sudo nano /usr/share/awk/pfcut

Fügen Sie dann das folgende Skript ein und speichern Sie es. Danach sieht die Verwendung folgendermaßen aus:

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk -f pfcut --source '/^/ { pfcut("-4"); }'
t1 t2 t3 t4

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk -f pfcut --source '/^/ { pfcut("2-"); }'
t2 t3 t4 t5 t6 t7

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk -f pfcut --source '/^/ { pfcut("-2,4,6-"); }'
t1 t2 t4 t6 t7

Um all das zu vermeiden, denke ich, dass das Beste, was man tun kann (siehe ansonsten Automatisches Laden einer Benutzerfunktion beim Start mit awk? - Unix & Linux Stack Exchange ), das Hinzufügen eines Alias ​​zu ~/.bashrc; zB mit:

$ echo "alias awk-pfcut='awk -f pfcut --source'" >> ~/.bashrc
$ source ~/.bashrc     # refresh bash aliases

... dann können Sie einfach anrufen:

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk-pfcut '/^/ { pfcut("-2,4,6-"); }'
t1 t2 t4 t6 t7

Hier ist die Quelle des pfcutSkripts:

# pfcut - print fields like cut
#
# sdaau, GNU GPL
# Nov, 2013

function spfcut(formatstring)
{
  # parse format string
  numsplitscomma = split(formatstring, fsa, ",");
  numspecparts = 0;
  split("", parts); # clear/initialize array (for e.g. `tail` piping into `awk`)
  for(i=1;i<=numsplitscomma;i++) {
    commapart=fsa[i];
    numsplitsminus = split(fsa[i], cpa, "-");
    # assume here a range is always just two parts: "a-b"
    # also assume user has already sorted the ranges
    #print numsplitsminus, cpa[1], cpa[2]; # debug
    if(numsplitsminus==2) {
     if ((cpa[1]) == "") cpa[1] = 1;
     if ((cpa[2]) == "") cpa[2] = NF;
     for(j=cpa[1];j<=cpa[2];j++) {
       parts[numspecparts++] = j;
     }
    } else parts[numspecparts++] = commapart;
  }
  n=asort(parts); outs="";
  for(i=1;i<=n;i++) {
    outs = outs sprintf("%s%s", $parts[i], (i==n)?"":OFS); 
    #print(i, parts[i]); # debug
  }
  return outs;
}

function pfcut(formatstring) {
  print spfcut(formatstring);
}
sdaau
quelle
Scheint, als ob Sie verwenden möchten cut, nichtawk
roblogic
5

Drucken von Spalten ab # 2 (die Ausgabe hat am Anfang keinen nachgestellten Platz):

ls -l | awk '{sub(/[^ ]+ /, ""); print $0}'
Savvadia
quelle
1
Schön, obwohl Sie +nach dem Leerzeichen hinzufügen sollten , da die Felder durch mehr als ein Leerzeichen getrennt sein können ( awkbehandelt mehrere benachbarte Leerzeichen als ein einziges Trennzeichen). Außerdem awkignoriert Räumen führen, so dass Sie die Regex mit beginnen sollte ^[ ]*. Mit Leerzeichen als Trennzeichen können Sie die Lösung sogar verallgemeinern. Das Folgende gibt beispielsweise alles aus dem 3. Feld zurück: awk '{sub(/^[ ]*([^ ]+ +){2}/, ""); print $0}'Mit beliebigen Feldtrennzeichen wird es jedoch schwieriger.
mklement0
5

Würde das funktionieren?

awk '{print substr($0,length($1)+1);}' < file

Es lässt jedoch etwas Leerzeichen vor sich.

Whaley
quelle
4
echo "1 2 3 4 5 6" | awk '{ $NF = ""; print $0}'

Dieser verwendet awk, um alle außer dem letzten Feld zu drucken

Kaushal Jha
quelle
3

Dies ist, was ich aus allen Empfehlungen bevorzugt habe:

Drucken von der 6. bis zur letzten Spalte.

ls -lthr | awk '{out=$6; for(i=7;i<=NF;i++){out=out" "$i}; print out}'

oder

ls -lthr | awk '{ORS=" "; for(i=6;i<=NF;i++) print $i;print "\n"}'
Manuel Parra
quelle
2

Wenn Sie bestimmte Spalten benötigen, die mit einem beliebigen Begrenzer gedruckt werden:

awk '{print $3 "  " $4}'

col # 3 col # 4

awk '{print $3 "anything" $4}'

col # 3anythingcol # 4

Wenn Sie also Leerzeichen in einer Spalte haben, sind es zwei Spalten, aber Sie können es mit jedem Trennzeichen oder ohne Trennzeichen verbinden.

I159
quelle
2

Perl-Lösung:

perl -lane 'splice @F,0,1; print join " ",@F' file

Diese Befehlszeilenoptionen werden verwendet:

  • -n Schleife um jede Zeile der Eingabedatei, drucke nicht automatisch jede Zeile

  • -l Entfernt Zeilenumbrüche vor der Verarbeitung und fügt sie anschließend wieder hinzu

  • -aAutosplit-Modus - Teilen Sie die Eingabezeilen in das @ F-Array. Standardmäßig wird auf Leerzeichen aufgeteilt

  • -e Führen Sie den Perl-Code aus

splice @F,0,1 Entfernt Spalte 0 sauber aus dem @ F-Array

join " ",@F Verbindet die Elemente des @ F-Arrays mit einem Leerzeichen zwischen den einzelnen Elementen


Python-Lösung:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[1:]) + '\n') for line in sys.stdin]" < file

Chris Koknat
quelle
1

Wenn Sie den Teil der Zeile, den Sie nicht abhacken, nicht neu formatieren möchten, ist die beste Lösung, die ich mir vorstellen kann, in meiner Antwort in:

Wie drucke ich alle Spalten nach einer bestimmten Nummer mit awk?

Es zerhackt, was vor der angegebenen Feldnummer N steht, und druckt den gesamten Rest der Zeile, einschließlich der Feldnummer N, und behält den ursprünglichen Abstand bei (es wird nicht neu formatiert). Es spielt keine Rolle, ob die Zeichenfolge des Feldes auch an einer anderen Stelle in der Zeile angezeigt wird.

Definieren Sie eine Funktion:

fromField () { 
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

Und benutze es so:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 

Die Ausgabe behält alles bei, einschließlich nachfolgender Leerzeichen

In Ihrem speziellen Fall:

svn status | grep '\!' | fromField 2 > removedProjs

Wenn Ihre Datei / Ihr Stream keine Zeilenumbrüche in der Mitte der Zeilen enthält (Sie könnten ein anderes Datensatztrennzeichen verwenden), können Sie Folgendes verwenden:

awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

Der erste Fall schlägt nur in Dateien / Streams fehl, die das seltene hexadezimale Zeichen Nummer 1 enthalten

Robert Vila
quelle
0

Dies würde funktionieren, wenn Sie Bash verwenden und Sie könnten so viele 'x' wie Elemente verwenden, die Sie verwerfen möchten, und es werden mehrere Leerzeichen ignoriert, wenn sie nicht maskiert werden.

while read x b; do echo "$b"; done < filename
Stuart Rothrock
quelle
0

Perl:

@m=`ls -ltr dir | grep ^d | awk '{print \$6,\$7,\$8,\$9}'`;
foreach $i (@m)
{
        print "$i\n";

}
pkm
quelle
1
Dies beantwortet nicht die Frage, die die Anforderung zum Drucken von der N-ten Spalte bis zum Ende verallgemeinert .
Roaima
0

Diese awkFunktion gibt einen Teilstring zurück $0, der Felder von beginbis enthält end:

function fields(begin, end,    b, e, p, i) {
    b = 0; e = 0; p = 0;
    for (i = 1; i <= NF; ++i) {
        if (begin == i) { b = p; }
        p += length($i);
        e = p;
        if (end == i) { break; }
        p += length(FS);
    }
    return substr($0, b + 1, e - b);
}

Um alles ab Feld 3 zu bekommen:

tail = fields(3);

Um einen Abschnitt davon zu erhalten $0, werden die Felder 3 bis 5 abgedeckt:

middle = fields(3, 5);

b, e, p, iUnsinn in der Funktionsparameterliste ist nur eine awkMöglichkeit, lokale Variablen zu deklarieren.

Wonder.mice
quelle
0

Ich möchte die vorgeschlagenen Antworten auf die Situation erweitern, in der Felder möglicherweise durch mehrere Leerzeichen begrenzt sind - der Grund, warum das OP cutvermutlich nicht verwendet .

Ich weiß, dass das OP gefragt hat awk, aber sedhier würde ein Ansatz funktionieren (Beispiel beim Drucken von Spalten vom 5. bis zum letzten):

  • Pure Sed Ansatz

    sed -r 's/^\s*(\S+\s+){4}//' somefile

    Erläuterung:

    • s/// wird standardmäßig zur Substitution verwendet
    • ^\s* Entspricht einem aufeinanderfolgenden Leerzeichen am Zeilenanfang
    • \S+\s+ bedeutet eine Datenspalte (Nicht-Leerzeichen, gefolgt von Leerzeichen)
    • (){4} bedeutet, dass das Muster viermal wiederholt wird.
  • sed und schneiden

    sed -r 's/^\s+//; s/\s+/\t/g' somefile | cut -f5-

    indem Sie nur aufeinanderfolgende Leerzeichen durch eine einzelne Registerkarte ersetzen;

  • tr und cut: trkann mit der Option auch verwendet werden, um aufeinanderfolgende Zeichen zu quetschen-s .

    tr -s [:blank:] <somefile | cut -d' ' -f5-
PlasmaBinturong
quelle
-1

Awk-Beispiele sehen hier komplex aus, hier ist die einfache Bash-Shell-Syntax:

command | while read -a cols; do echo ${cols[@]:1}; done

Wo 1zählt Ihre n- te Spalte von 0?


Beispiel

Angesichts dieses Inhalts von file ( in.txt):

c1
c1 c2
c1 c2 c3
c1 c2 c3 c4
c1 c2 c3 c4 c5

Hier ist die Ausgabe:

$ while read -a cols; do echo ${cols[@]:1}; done < in.txt 

c2
c2 c3
c2 c3 c4
c2 c3 c4 c5
Kenorb
quelle
-1

Ich war mit keiner der awkhier vorgestellten Lösungen zufrieden , weil ich die ersten Spalten extrahieren und dann den Rest drucken wollte, also wandte ich mich perlstattdessen an. Der folgende Code extrahiert die ersten beiden Spalten und zeigt den Rest unverändert an:

echo -e "a  b  c  d\te\t\tf g" | \
  perl -ne 'my @f = split /\s+/, $_, 3; printf "first: %s second: %s rest: %s", @f;'

Der Vorteil gegenüber der perlLösung von Chris Koknat besteht darin, dass tatsächlich nur die ersten n Elemente von der Eingabezeichenfolge abgespalten werden. Der Rest der Saite ist überhaupt nicht geteilt und bleibt daher vollständig intakt. Mein Beispiel zeigt dies mit einer Mischung aus Leerzeichen und Tabulatoren.

Um die Anzahl der zu extrahierenden Spalten zu ändern, ersetzen Sie die 3im Beispiel durch n + 1.

Martin von Wittich
quelle
-1
ls -la | awk '{o=$1" "$3; for (i=5; i<=NF; i++) o=o" "$i; print o }'

Von dieser Antwort ist nicht schlecht, aber der natürliche Abstand ist weg.
Bitte vergleichen Sie es dann mit diesem:

ls -la | cut -d\  -f4-

Dann würden Sie den Unterschied sehen.

Selbst ls -la | awk '{$1=$2=""; print}'was auf der bisher am besten gewählten Antwort basiert, behält die Formatierung nicht bei.

Daher würde ich Folgendes verwenden und es erlaubt am Anfang auch explizite selektive Spalten:

ls -la | cut -d\  -f1,4-

Beachten Sie, dass jedes Leerzeichen auch für Spalten zählt. Im Folgenden sind beispielsweise die Spalten 1 und 3 leer, 2 ist INFO und 4 ist:

$ echo " INFO  2014-10-11 10:16:19  main " | cut -d\  -f1,3

$ echo " INFO  2014-10-11 10:16:19  main " | cut -d\  -f2,4
INFO 2014-10-11
$
arntg
quelle
-1

Wenn Sie formatierten Text möchten, verketten Sie Ihre Befehle mit echo und drucken Sie mit $ 0 das letzte Feld.

Beispiel:

for i in {8..11}; do
   s1="$i"
   s2="str$i"
   s3="str with spaces $i"
   echo -n "$s1 $s2" | awk '{printf "|%3d|%6s",$1,$2}'
   echo -en "$s3" | awk '{printf "|%-19s|\n", $0}'
done

Drucke:

|  8|  str8|str with spaces 8  |
|  9|  str9|str with spaces 9  |
| 10| str10|str with spaces 10 |
| 11| str11|str with spaces 11 |
Syntax
quelle
-9

Wegen einer falschen, am besten bewerteten Antwort mit 340 Stimmen habe ich gerade 5 Minuten meines Lebens verloren! Hat jemand diese Antwort ausprobiert, bevor er sie bewertet hat? Anscheinend nicht. Völlig nutzlos.

Ich habe ein Protokoll, in dem nach $ 5 mit einer IP-Adresse mehr Text oder kein Text sein kann. Ich brauche alles von der IP-Adresse bis zum Ende der Leitung, sollte es nach 5 Dollar etwas geben. In meinem Fall ist dies tatsächlich ein awk-Programm, kein awk-Oneliner, also muss awk das Problem lösen. Wenn ich versuche, die ersten 4 Felder mit der am besten bewerteten, aber völlig falschen Antwort zu entfernen:

echo "  7 27.10.16. Thu 11:57:18 37.244.182.218" | awk '{$1=$2=$3=$4=""; printf "[%s]\n", $0}'

es spuckt eine falsche und nutzlose Antwort aus (ich habe [..] hinzugefügt, um zu demonstrieren):

[    37.244.182.218 one two three]

Es gibt sogar einige Vorschläge, um Substr mit dieser falschen Antwort zu kombinieren. So ist Komplikation eine Verbesserung.

Wenn die Spalten eine feste Breite haben, bis der Schnittpunkt und awk benötigt werden, lautet die richtige Antwort:

echo "  7 27.10.16. Thu 11:57:18 37.244.182.218" | awk '{printf "[%s]\n", substr($0,28)}'

welches die gewünschte Ausgabe erzeugt:

[37.244.182.218 one two three]
Pila
quelle