Frage

Ich versuche, die ersten beiden Spalten zu entfernen (von denen ich nicht interessiert bin) von einer DbgView Protokolldatei. Ich kann nicht scheinen, um ein Beispiel zu finden, die aus der Spalte druckt 3 an bis zum Ende der Zeile. Beachten Sie, dass jede Zeile variable Anzahl von Spalten.

War es hilfreich?

Lösung

... oder eine einfachere Lösung. cut -f 3- INPUTFILE fügen Sie einfach die richtigen Trennzeichen (-d) und Sie haben den gleichen Effekt

Andere Tipps

awk '{for(i=3;i<=NF;++i)print $i}' 

Jonathan Feinberg 's Antwort druckt jedes Feld in einer separaten Zeile. Sie könnten printf verwenden den Datensatz für die Ausgabe auf der gleichen Linie neu zu erstellen, aber Sie können auch nur die Felder ein Sprung nach links bewegen.

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
awk '{$1=$2=$3=""}1' file

. NB: diese Methode „Rohlinge“ in 1,2,3 Feldern verlassen, aber kein Problem, wenn Sie nur am Ausgang aussehen wollen

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

Diese hackt, was vor dem Feld Nr gegeben ist., N, und druckt alle den Rest der Linie, einschließlich Feld nr.N und den ursprünglichen Abstand beibehalten wird (es umformatieren nicht). Es spielt keine mater, wenn die Zeichenfolge des Feldes auch in der Linie irgendwo anders erscheint, das das Problem mit daisaa Antwort ist.

Definieren

eine Funktion:

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

Und es wie folgt verwendet werden:

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

Ausgabe hält alles, einschließlich Leerzeichen

Funktioniert gut für Dateien, in denen ‚/ n‘ die voneinander zu trennen sind, so dass Sie nicht haben, dass new-line Zeichen innerhalb der Linien. Wenn Sie es mit anderen Datensatz Trennzeichen verwenden wollen, dann verwenden:

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

zum Beispiel. Funktioniert gut mit fast allen Dateien, solange sie nicht hexadezimalen Zeichen nr verwenden Sie. 1 innerhalb der Linien.

Was ist folgende Zeile:

awk '{$1=$2=$3=""; print}' file

Basierend auf @ ghostdog74 Vorschlag. Mine sollte besser verhalten, wenn Sie Zeilen filtern, das heißt:.

awk '/^exim4-config/ {$1=""; print }' file

Wenn Sie die Spalten nach dem 3. zum Beispiel in der gleichen Zeile drucken möchten, können Sie verwenden:

awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'

Zum Beispiel:

Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf

Es wird gedruckt:

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf

Wie wir sehen können, die payslip auch mit Raum, zeigt in der richtigen Linie.

Das folgende awk Befehl druckt die letzten N Felder jeder Zeile und am Ende der Zeile druckt eine neue Zeile Zeichen:

awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'

Unten finden Sie ein Beispiel, das den Inhalt des / usr / bin-Verzeichnis listet und hält dann die letzten drei Zeilen und druckt dann die letzten vier Spalten jeder Zeile awk mit:

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype

Nun, können Sie leicht den gleichen Effekt erreichen einen regulären Ausdruck. Unter der Annahme den Separator ist ein Raum, es würde so aussehen:

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'

Perl Lösung:

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

Diese Befehlszeilenoptionen verwendet:

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

  • -l entfernt Zeilenumbrüche vor der Verarbeitung und fügt sie wieder in später

  • -a Autosplit-Modus - Split-Eingangsleitungen in die @F Array. Defaults zu Splitting auf Leerzeichen

  • -e führen Sie den Perl-Code

splice @F,0,2 sauber entfernt Spalten 0 und 1 aus dem @F Array

join " ",@F die Elemente des @F Array verbindet, um einen Raum in-zwischen jedem Element mit

Wenn Ihre Eingabedatei durch Komma getrennte, anstatt durch Leerzeichen getrennte, Verwendung -F, -lane


Python Lösung:

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

awk '{a=match($0, $3); print substr($0,a)}'

Zuerst die Position des Beginns der dritten Spalte finden. Mit substr druckt man die ganze Zeile ($ 0), beginnend an der Position (in diesem Fall a) bis zum Ende der Zeile.

Ein bisschen spät hier, aber keiner der oben schien zu funktionieren. Versuchen Sie dies, printf verwenden, fügt Leerzeichen zwischen den einzelnen. Ich wählte nicht Newline haben, am Ende.

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

drucken Datensätze aus dem 4. Feld in der gleichen Reihenfolge auf das letzte Feld beginnen sie in der Originaldatei waren

In Bash können Sie die folgende Syntax mit Positionsparameter verwenden:

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

Weitere Informationen: Handhabung Positionsparameter bei Bash Hacker Wiki

Wenn seine nur über die ersten beiden Felder zu ignorieren und wenn Sie keinen Platz haben wollen, wenn diese Felder Maskierung (wie einige der Antworten oben tun):

awk '{gsub($1" "$2" ",""); print;}' file
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

Die ersten zwei Spalten gelöscht, entfernt sed Räume führen.

In AWK Spalten werden Felder genannt, daher NF ist der Schlüssel

alle Zeilen:

awk -F '<column separator>' '{print $(NF-2)}' <filename>

erste Zeile nur:

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top