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.


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

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.)


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"}'

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.


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.


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.


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


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);
}

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}'

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.


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

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


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"}'

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.


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


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


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

0

Perl:

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

}

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.


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-

-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

-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.


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

-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 |

-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]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.