Ich versuche, die ersten beiden Spalten (von denen ich nicht interessiert bin) aus einer DbgView-Protokolldatei zu entfernen. Ich kann anscheinend kein Beispiel finden, das von Spalte 3 bis zum Ende der Zeile gedruckt wird. Beachten Sie, dass jede Zeile eine variable Spaltenanzahl hat.
... oder eine einfachere Lösung: cut -f 3- INPUTFILE
füge einfach das richtige Trennzeichen (-d) hinzu und du hast den gleichen Effekt.
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{ print substr($0, index($0,$3)) }'
lösung hier gefunden:
http://www.linuxquestions.org/fragen/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
Die Antwort von Jonathan Feinberg druckt jedes Feld in einer separaten Zeile. Sie können printf
verwenden, um den Datensatz für die Ausgabe in derselben Zeile wiederherzustellen, Sie können die Felder aber auch einfach um einen Sprung nach links verschieben.
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
awk '{$1=$2=$3=""}1' file
Hinweis: Diese Methode hinterlässt "Leerstellen" in 1,2,3-Feldern, ist aber kein Problem, wenn Sie nur die Ausgabe betrachten möchten.
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Dies schneidet das vor dem angegebenen Feld Nr., N, ab und druckt den Rest der Zeile, einschließlich Feld Nr. N und Beibehalten des ursprünglichen Abstands (es wird nicht neu formatiert). Es ist unerheblich, ob die Zeichenfolge des Felds auch an anderer Stelle in der Zeile angezeigt wird. Dies ist das Problem mit der Antwort von daisaa.
Eine Funktion definieren:
fromField () {
awk -v m="\x0a" -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 der Leerzeichen
Funktioniert gut bei Dateien, bei denen '/ n' das Datensatztrennzeichen ist, sodass das Zeichen für die neue Zeile nicht in den Zeilen enthalten ist. Wenn Sie es mit anderen Datensatztrennzeichen verwenden möchten, verwenden Sie Folgendes:
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
zum Beispiel. Funktioniert mit fast allen Dateien gut, solange sie keine hexadezimalen Zeichen verwenden. 1 innerhalb der Zeilen.
Wenn Sie die Spalten nach der 3. Zeile beispielsweise in derselben Zeile drucken möchten, können Sie Folgendes 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, zeigt die Gehaltsabrechnung selbst mit Leerzeichen in der richtigen Zeile.
Was ist mit der folgenden Zeile:
awk '{$ 1 = $ 2 = $ 3 = ""; Druckdatei
Basierend auf dem @ ghostdog74-Vorschlag. Meine sollte sich besser verhalten, wenn Sie Zeilen filtern, d. H .:
awk '/ ^ exim4-config/{$ 1 = ""; Druckdatei
Der folgende Befehl awk druckt die letzten N Felder jeder Zeile und am Ende der Zeile ein neues Zeilenzeichen:
awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Im Folgenden finden Sie ein Beispiel, in dem der Inhalt des Verzeichnisses/usr/bin aufgelistet ist und die letzten 3 Zeilen enthalten und dann die letzten 4 Spalten jeder Zeile mit awk gedruckt werden:
$ 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, Sie können den gleichen Effekt leicht mit einem regulären Ausdruck erzielen. Angenommen, das Trennzeichen ist ein Leerzeichen, würde es wie folgt aussehen:
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
Perl-Lösung:
Perl -lane 'splice @F,0,2; print join " ",@F' file
Diese Befehlszeilenoptionen werden verwendet:
-n
Durchläuft jede Zeile der Eingabedatei und druckt nicht automatisch jede Zeile
-l
Entfernt Zeilenumbrüche vor der Verarbeitung und fügt sie anschließend wieder ein
-a
Autosplit-Modus - Teilen Sie die Eingabezeilen in das @F-Array. Standardmäßig wird auf Leerzeichen aufgeteilt
-e
Führe den Perl-Code aus
splice @F,0,2
Entfernt die Spalten 0 und 1 sauber aus dem @F-Array
join " ",@F
Fügt die Elemente des @F-Arrays mit einem Leerzeichen zwischen den Elementen zusammen
Wenn Ihre Eingabedatei durch Kommas und nicht durch Leerzeichen getrennt ist, verwenden Sie -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 finden Sie die Position des Anfangs der dritten Spalte. Mit substr drucken Sie die gesamte Zeile ($ 0) von der Position (in diesem Fall a) bis zum Zeilenende.
In Bash können Sie die folgende Syntax mit Positionsparametern verwenden:
while read -a cols; do echo ${cols[@]:2}; done < file.txt
Weitere Informationen: Umgang mit Positionsparametern bei Bash Hackers Wiki
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'
druckt Datensätze vom vierten bis zum letzten Feld in derselben Reihenfolge wie in der Originaldatei
Etwas spät hier, aber nichts davon schien zu funktionieren. Versuchen Sie dies, indem Sie mit printf Leerzeichen einfügen. Ich habe mich dafür entschieden, am Ende keinen Zeilenumbruch zu haben.
awk '{for(i=3;i<=NF;++i) printf("%s ", $i) }'
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'
Die ersten beiden Spalten werden gelöscht, sed
entfernt führende Leerzeichen.
Wenn es nur darum geht, die ersten beiden Felder zu ignorieren, und wenn Sie beim Maskieren dieser Felder kein Leerzeichen wünschen (wie es einige der obigen Antworten tun):
awk '{gsub($1" "$2" ",""); print;}' file