Su shell, eseguo il pipe per awk quando ho bisogno di una colonna particolare.
Stampa la colonna 9, ad esempio:
... | awk '{print $9}'
Come posso dire a awk di stampare tutte le colonne inclusa e dopo la colonna 9 , non solo la colonna 9?
Su shell, eseguo il pipe per awk quando ho bisogno di una colonna particolare.
Stampa la colonna 9, ad esempio:
... | awk '{print $9}'
Come posso dire a awk di stampare tutte le colonne inclusa e dopo la colonna 9 , non solo la colonna 9?
Risposte:
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
o perl
per questo. Usalo solo se insisti davvero per averlo awk
.
Quando vuoi fare una serie di campi, awk
non hai davvero un modo semplice per farlo. Consiglierei cut
invece:
cut -d' ' -f 9- ./infile
Aggiunto delimitatore di campo spazio perché l'impostazione predefinita è una scheda. Grazie a Glenn per averlo fatto notare
find . | xargs ls -l | cut -d' ' -f 9-
. Per qualche ragione vengono contati anche i doppi spazi. Esempio: lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
si tradurrà in./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
Modifica : nota, questo non funziona se un campo prima del nono contiene lo stesso valore del nono.
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
Invece di occuparsi di spazi bianchi a larghezza variabile, sostituire tutti gli spazi bianchi come spazio singolo. Quindi usa semplice cut
con i campi di interesse.
Non usa awk, quindi non è pertinente ma sembrava appropriato date le altre risposte / commenti.
ps faux |
uso. Non aver mai paura di ammettere che lo strumento XYZ non è il più appropriato.
Generalmente perl sostituisce awk / sed / grep et. al., ed è molto più portabile (oltre ad essere solo un temperino migliore).
perl -lane 'print "@F[8..$#F]"'
Timtowtdi si applica ovviamente.
-l
o aggiungere \n
all'istruzione print.
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Questo taglia ciò che è prima del campo nr., N, e stampa tutto il resto della riga, incluso il campo nrN e mantenendo la spaziatura originale (non si riformatta). Non importa se la stringa del campo appare anche da qualche altra parte nella riga, che è il problema con la risposta di Ascherer.
Definisci una funzione:
fromField () {
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
E usalo in questo modo:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
L'output mantiene tutto, inclusi gli spazi finali Per N = 0 restituisce l'intera riga, così com'è, e per n> NF la stringa vuota
Ecco un esempio di ls -l
output:
-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
La mia soluzione per stampare qualsiasi post $9
èawk '{print substr($0, 61, 50)}'
Per visualizzare i primi 3 campi e stampare i campi rimanenti puoi utilizzare:
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
dove $ 1 $ 2 $ 3 sono i primi 3 campi.
Usare cut invece di awk e superare i problemi con la determinazione della colonna da cui iniziare usando il comando -c character cut.
Qui sto dicendo, dammi tutto tranne i primi 49 caratteri dell'output.
ls -l /some/path/*/* | cut -c 50-
Alla /*/*/
fine del comando ls sta dicendo mostrami anche cosa c'è nelle sottodirectory.
Puoi anche estrarre alcuni intervalli di caratteri ala (dalla pagina man di cut). Ad esempio, mostra i nomi e gli orari di accesso degli utenti attualmente connessi:
who | cut -c 1-16,26-38