Auf der Shell pfeife ich zu awk, wenn ich eine bestimmte Spalte benötige.
Dies druckt Spalte 9, zum Beispiel:
... | awk '{print $9}'
Wie kann ich awk anweisen, alle Spalten einschließlich und nach Spalte 9 zu drucken , nicht nur Spalte 9?
Auf der Shell pfeife ich zu awk, wenn ich eine bestimmte Spalte benötige.
Dies druckt Spalte 9, zum Beispiel:
... | awk '{print $9}'
Wie kann ich awk anweisen, alle Spalten einschließlich und nach Spalte 9 zu drucken , nicht nur Spalte 9?
Antworten:
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
cut
oder perl
dafür. Verwenden Sie dies nur, wenn Sie wirklich darauf bestehen, es zu haben awk
.
Wenn Sie eine Reihe von Feldern ausführen möchten, awk
haben Sie keine direkte Möglichkeit, dies zu tun. Ich würde cut
stattdessen empfehlen :
cut -d' ' -f 9- ./infile
Leerzeichen-Feldbegrenzer hinzugefügt, da standardmäßig eine Registerkarte ist. Vielen Dank an Glenn für diesen Hinweis
find . | xargs ls -l | cut -d' ' -f 9-
. Aus irgendeinem Grund werden auch doppelte Leerzeichen gezählt. Beispiel: lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
führt zu./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
Bearbeiten : Beachten Sie, dass dies nicht funktioniert, wenn ein Feld vor dem neunten den gleichen Wert wie das neunte enthält.
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
Ersetzen Sie anstelle von Leerzeichen mit variabler Breite alle Leerzeichen als einzelne Leerzeichen. Dann verwenden Sie einfach cut
mit den Feldern von Interesse.
Es verwendet kein awk, ist also nicht deutsch, schien aber angesichts der anderen Antworten / Kommentare angemessen.
ps faux |
Einsatz. Haben Sie niemals Angst, das Tool XYZ zuzulassen, das nicht am besten geeignet ist.
Im Allgemeinen ersetzt Perl awk / sed / grep et. al. und ist viel tragbarer (und einfach nur ein besseres Taschenmesser).
perl -lane 'print "@F[8..$#F]"'
Timtowtdi gilt natürlich.
-l
oder \n
der print-Anweisung hinzufügen .
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Dies zerhackt, was vor dem angegebenen Feld nr., N steht, und druckt den gesamten Rest der Zeile, einschließlich Feld nr.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 erscheint, was das Problem mit Ascherers Antwort ist.
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. Für N = 0 wird die gesamte Zeile unverändert und für n> NF die leere Zeichenfolge zurückgegeben
Hier ist ein Beispiel für die ls -l
Ausgabe:
-rwxr-----@ 1 ricky.john 1493847943 5610048 Apr 16 14:09 00-Welcome.mp4
-rwxr-----@ 1 ricky.john 1493847943 27862521 Apr 16 14:09 01-Hello World.mp4
-rwxr-----@ 1 ricky.john 1493847943 21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
-rwxr-----@ 1 ricky.john 1493847943 10627144 Apr 16 14:09 03-Where to Get Help.mp4
Meine Lösung, um irgendetwas zu drucken, $9
istawk '{print substr($0, 61, 50)}'
So zeigen Sie die ersten 3 Felder an und drucken die verbleibenden Felder aus:
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
Dabei sind $ 1 $ 2 $ 3 die ersten 3 Felder.
Verwenden Sie cut anstelle von awk und überwinden Sie Probleme mit dem Befehl -c cut cut, um herauszufinden, bei welcher Spalte Sie beginnen sollen.
Hier sage ich, gib mir alle bis auf die ersten 49 Zeichen der Ausgabe.
ls -l /some/path/*/* | cut -c 50-
Das /*/*/
Befehl am Ende des Befehls ls zeigt an, was sich auch in Unterverzeichnissen befindet.
Sie können auch bestimmte Zeichenbereiche herausziehen (aus der Manpage zum Ausschneiden). Zeigen Sie beispielsweise die Namen und Anmeldezeiten der aktuell angemeldeten Benutzer an:
who | cut -c 1-16,26-38