J'essaie de supprimer les deux premières colonnes (dont je ne suis pas intéressé) d'un fichier journal DbgView. Je n'arrive pas à trouver un exemple imprimant à partir de la colonne 3 jusqu'à la fin de la ligne. Notez que chaque ligne a un nombre variable de colonnes.
... ou une solution plus simple: cut -f 3- INPUTFILE
ajoutez simplement le délimiteur correct (-d) et vous obtenez le même effet.
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{ print substr($0, index($0,$3)) }'
solution trouvée ici:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count 17-1778/
La réponse de Jonathan Feinberg _ imprime chaque champ sur une ligne distincte. Vous pouvez utiliser printf
pour reconstruire l’enregistrement pour une sortie sur la même ligne, mais vous pouvez également déplacer les champs d’un saut vers la gauche.
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
awk '{$1=$2=$3=""}1' file
NB: cette méthode laissera des "blancs" dans les champs 1, 2, 3, mais ce n’est pas un problème si vous voulez seulement regarder la sortie.
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Cela coupe ce qui se trouve avant le numéro de champ donné, N, et imprime tout le reste de la ligne, y compris le champ n.N et en maintenant l'espacement d'origine (il ne reformate pas). Peu importe que la chaîne du champ apparaisse également ailleurs dans la ligne, ce qui pose problème avec la réponse de Daisaa.
Définir une fonction:
fromField () {
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
Et utilisez-le comme ceci:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
La sortie conserve tout, y compris les espaces de fin
Fonctionne bien pour les fichiers où '/ n' est le séparateur d'enregistrement, de sorte que vous n'avez pas ce caractère de nouvelle ligne à l'intérieur des lignes. Si vous voulez l'utiliser avec d'autres séparateurs d'enregistrement, utilisez:
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
par exemple. Fonctionne bien avec presque tous les fichiers tant qu'ils n'utilisent pas le caractère hexadécimal. 1 à l'intérieur des lignes.
Si vous souhaitez imprimer les colonnes après la 3ème par exemple dans la même ligne, vous pouvez utiliser:
awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'
Par exemple:
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
Il imprimera:
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
Comme on peut le constater, la fiche de paie, même avec de l'espace, s'affiche dans la ligne correcte.
Qu'en est-il de la ligne suivante:
awk '{$ 1 = $ 2 = $ 3 = ""; imprimer le fichier
Basé sur la suggestion de @ ghostdog74. Le mien devrait se comporter mieux lorsque vous filtrez des lignes, c'est-à-dire:
awk '/ ^ exim4-config/{$ 1 = ""; imprimer le fichier
La commande awk suivante imprime les N derniers champs de chaque ligne et à la fin de la ligne, un nouveau caractère de ligne:
awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Vous trouverez ci-dessous un exemple répertoriant le contenu du répertoire/usr/bin, contenant les 3 dernières lignes puis imprimant les 4 dernières colonnes de chaque ligne à l'aide de awk:
$ 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
Eh bien, vous pouvez facilement obtenir le même effet en utilisant une expression régulière. En supposant que le séparateur soit un espace, cela ressemblerait à:
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
awk '{a=match($0, $3); print substr($0,a)}'
Vous trouvez d’abord la position du début de la troisième colonne. Avec substr, vous imprimerez la ligne entière ($ 0) en partant de la position (dans ce cas a) jusqu'à la fin de la ligne.
Dans Bash, vous pouvez utiliser la syntaxe suivante avec des paramètres de position:
while read -a cols; do echo ${cols[@]:2}; done < file.txt
En savoir plus: Gestion des paramètres de position sur Bash Hackers Wiki
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'
imprime les enregistrements à partir du 4ème champ jusqu'au dernier champ dans le même ordre qu'ils étaient dans le fichier d'origine
Un peu tard ici, mais rien de ce qui précède ne semblait fonctionner. Essayez ceci en utilisant printf, insérez des espaces entre chaque. J'ai choisi de ne pas avoir de nouvelle ligne à la fin.
awk '{for(i=3;i<=NF;++i) printf("%s ", $i) }'
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'
Les deux premières colonnes sont effacées, sed
supprime les espaces de début.
S'il ne s'agit que d'ignorer les deux premiers champs et si vous ne voulez pas d'espace pour masquer ces champs (comme le font certaines des réponses ci-dessus):
awk '{gsub($1" "$2" ",""); print;}' file