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")}'
cut
lub perl
do tego. Używaj tego tylko wtedy, gdy naprawdę nalegasz na to, aby go mieć awk
.
Jeśli chcesz wykonać szereg pól, awk
nie ma na to prostego sposobu. cut
Zamiast 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_b
spowoduje./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 cut
z 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.
-l
lub dodać \n
do 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 -l
wyniku:
-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 $9
jestawk '{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