1 votes

Supprimer les 8 premières colonnes de la sortie ls avec AWK

Je voudrais utiliser AWK pour supprimer les 8 premières colonnes de la sortie suivante :

ls -l

lrwxrwxrwx 1 user user   23 jul 27 00:04 file1.pdf
-rw-rw-r-- 1 user user  107 may  8 13:59 file 2 with spaces.mp3
lrwxrwxrwx 1 user user   11 jul 24 19:43 file3-with-hyphens.txt
lrwxrwxrwx 1 user user   11 jul 24 19:43 and_another_file4_with_underscores.md
-rw-rw-r-- 1 user user  107 may  8 13:59 file 5 with way more spaces than the rest.mp3

et envoyer le résultat dans un fichier texte. Je peux le faire manuellement dans vim avec visual block select, mais je préférerais avoir un script pour le faire automatiquement.

En regardant autour de moi, j'ai pu trouver este où, en modifiant les parties pertinentes du 9ème exemple et en transférant la sortie vers elle-même autant de fois que nécessaire, j'ai pu obtenir le résultat souhaité, mais je pense qu'il doit y avoir une meilleure façon (plus élégante et/ou compacte) de le faire, mais je n'ai pas été en mesure de la trouver ou d'inventer la mienne.

Mon code final est le suivant :

awk '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=1 ~/file_folder_content.txt | awk '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=1 | ... | awk '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=1 >> ~/file_folder_content.txt

Note 1 : Je m'attends à ce que la sortie réelle de l'appareil ls pour être beaucoup plus large que cela.

Note 2 : J'ai essayé d'imprimer le 9ème champ, mais comme certains noms de fichiers contiennent des espaces, cela n'imprime que le premier mot du nom de fichier.

1voto

simlev Points 3517

Cela devrait faire ce que vous voulez dans awk :

ls -l | awk '$9~/./{for (i=1;i<9;i++){$i=""}; gsub(/^ +/,""); print}'

Voici une approche légèrement différente dans perl :

ls -l | perl -lane 'if ($F[7]=~/./) {s/.*$F[7]//; print}'

Note : Je ne peux que vous recommander de réfléchir sérieusement à ce que vous souhaitez réellement réaliser, car il existe peut-être de meilleures solutions. Comme mentionné par @confetti le simple fait d'imprimer les noms de fichiers est plus simple à réaliser avec ls -1 .

Note : Comme le soulignent à juste titre les commentaires, cette solution n'est pas robuste. J'ajouterais qu'aucune analyse syntaxique de ls peut être considéré comme sain et sauf.

Apprendre AWK : Puisque l'OP a expliqué dans les commentaires que cette question fait partie d'une quête plus large pour devenir compétent en AWK, j'ai quelques recommandations.

  • Passez par cet excellent AWK tutoriel
  • Gardez cette guide de référence toujours ouvert
  • Lisez cette courte article sur les variables intégrées de AWK
  • Étudiez quelques-unes des innombrables réponses à AWK questions sur StackExchange
  • Considérez les alternatives, résumé aquí

0voto

Kamil Maciorowski Points 57004

Cela ressemble à un Le problème XY . ls -1 devrait imprimer ce que vous voulez. Cette option est exigée par POSIX, il est donc peu probable que votre fichier ls ne le supporte pas.

Cependant, si vous êtes sur le point d'analyser le résultat, vous devez ne devrait pas utiliser ls du tout. Utilisez find de préférence avec -print0 action.

Alors ls n'est pas le bon outil. Si vous insistez pour analyser les données ls de toute façon, alors awk n'est peut-être pas non plus le bon outil. Raisonnement :

  • Vos colonnes sont séparées par des espaces ; il y a parfois deux ou trois espaces consécutifs, cela diffère d'une ligne à l'autre. Ainsi, avec ce séparateur naïf, un nom de fichier dans une ligne peut commencer à la Nième colonne, alors que dans une autre ligne, il se trouve à la (N+1)ième colonne.
  • Vous pouvez dire awk pour traiter plusieurs espaces comme un seul séparateur ( awk -F ' +' ), mais cela gâchera les noms de fichiers comportant de nombreux espaces consécutifs.
  • Il faut donc une certaine logique pour identifier où commence un nom de fichier sur chaque ligne. Cela peut être fait (je crois awk est complet de Turing), je ne peux cependant pas vous donner de solution fonctionnelle.

Même la sortie de ls -1 ne devrait pas être analysé, ls -l est pire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X