W powłoce potokuję do awk, gdy potrzebuję określonej kolumny.
Spowoduje to wydrukowanie kolumny 9, na przykład:
... | awk '{print $9}'
Jak mogę powiedzieć awk, żeby wypisał wszystkie kolumny, włączając i po kolumnie 9 , a nie tylko kolumnę 9?
Odpowiedzi:
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")}'
cutlub perldo tego. Używaj tego tylko wtedy, gdy naprawdę nalegasz na to, aby go mieć awk.
Jeśli chcesz wykonać szereg pól, awknie ma na to prostego sposobu. cutZamiast tego polecam :
cut -d' ' -f 9- ./infile
Dodano ogranicznik spacji, ponieważ domyślnie jest to tabulator. Dzięki Glenn za wskazanie tego
find . | xargs ls -l | cut -d' ' -f 9-. Z jakiegoś powodu liczone są również podwójne spacje. Przykład: lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_bspowoduje./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
Edycja : Uwaga, to nie działa, jeśli jakiekolwiek pole przed dziewiątą zawiera taką samą wartość jak dziewiąta.
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
Zamiast zajmować się białymi znakami o zmiennej szerokości, zamień wszystkie białe znaki na pojedynczą spację. Następnie użyj prostego cutz interesującymi polami.
Nie używa awk, więc nie jest normalne, ale wydaje się odpowiednie, biorąc pod uwagę inne odpowiedzi / komentarze.
ps faux | użycia. Nigdy nie bój się przyznać, że narzędzie XYZ nie jest najwłaściwsze.
Ogólnie perl zastępuje awk / sed / grep et. al., i jest znacznie bardziej przenośny (a także po prostu lepszy scyzoryk).
perl -lane 'print "@F[8..$#F]"'
Oczywiście obowiązuje Timtowtdi.
-llub dodać \ndo instrukcji print.
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
To odcina to, co jest przed danym polem nr., N, i wypisuje całą resztę wiersza, łącznie z polem nr N i zachowując oryginalne odstępy (nie zmienia formatowania). Nie ma znaczenia, czy ciąg pola pojawia się również gdzie indziej w wierszu, co jest problemem z odpowiedzią Ascherera.
Zdefiniuj funkcję:
fromField () {
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
I użyj tego w ten sposób:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
Wyjście zachowuje wszystko, łącznie ze spacjami końcowymi. Dla N = 0 zwraca cały wiersz taki, jaki jest, a dla n> NF pusty łańcuch
Oto przykład ls -lwyniku:
-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
Moje rozwiązanie do druku cokolwiek postu $9jestawk '{print substr($0, 61, 50)}'
Aby wyświetlić pierwsze 3 pola i wydrukować pozostałe pola, możesz użyć:
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
gdzie 1 $ 2 $ 3 to pierwsze 3 pola.
Używanie cut zamiast awk i przezwyciężanie problemów z ustalaniem, od której kolumny zacząć, za pomocą polecenia -c znak cut.
Tutaj mówię, podaj mi wszystkie oprócz pierwszych 49 znaków wyniku.
ls -l /some/path/*/* | cut -c 50-
Na /*/*/końcu polecenia ls mówi, że pokaż mi, co jest również w podkatalogach.
Możesz także wyciągnąć pewne zakresy znaków ala (z wyciętej strony podręcznika). Np. Pokaż nazwy i czasy logowania aktualnie zalogowanych użytkowników:
who | cut -c 1-16,26-38