Exécuter sur tous les fichiers dans un répertoire, traitant chacune séparément, à l'aide de AWK
Je veux lancer un script AWK sur chaque fichier dans un répertoire, mais le AWK commande doit s'exécuter uniquement à l'intérieur du fichier - qui est, il recherche entre un définies RS et renvoie ce qu'il est censé le faire, mais j'en ai besoin pour arrêter lorsqu'il atteint la fin d'un fichier, et de recommencer au début du fichier suivant.
J'ai cette course qui fonctionne sur chaque fichier individuellement:
awk '!/value1|value2/&& NF {print FILENAME " - " RS,$1}' RS="value" file1 > result.txt
Mais la sortie n'est pas correct, disons, lors de l'application pour chaque fichier dans un répertoire à l'aide de
find . -type f | awk ... file1 > result.txt
Comment pourrais-je l'obtenir à regarder à chaque fichier individuellement, mais ajouter le résultat dans le même fichier? Je n'ai aucune idée malheureusement. Je suppose que c'est par l'ajout de chaque fichier dans une variable et ayant AWK regarde, mais je ne suis pas sûr de savoir comment faire.
Fichier fichier1:
interface Vlan3990
ip address 172.17.226.23 255.255.255.254
Fichier fichier2:
version 12.2
ip tacacs source-interface Loopback99
ip vrf test
description xx
interface Loopback99
description Management Loopback
interface Loopback100
shutdown
De sortie
find . -type f | xargs awk '!/description|shutdown/&& NF {print FILENAME " - " RS,$1}' RS="interface" | more
./file1 - interface Vlan3990
./file2 - interface version
Je ne suis pas sûr de l'endroit où la sortie "la version de l'interface' est à venir à partir de...
- script shell pour l'appel awk sur chaque fichier séparément? ou COMMENCER/BEGINFILE/FIN/ENDFILE mis en œuvre en cas de besoin?
- oui - de sorte qu'il ressemble à un fichier, exécute la commande, s'arrête, puis ouvre le fichier suivant dans le répertoire, exécute la commande, arrêts, etc... ne sais pas comment l'obtenir pour ce faire, comme il y a 300+ fichiers dans le répertoire
- Pouvez-vous expliquer la phrase mais la sortie n'est pas correct? Quelles sont les différences entre ce que vous obtenez et ce que vous attendez?
- dans chaque fichier, il y a une dernière occurrence de la RS, de sorte qu'il semble, et les retours entre la dernière occurrence dans le premier fichier et la première occurrence de la deuxième fichier...
- Clarifier ce que vous essayez de faire avec venu de l'échantillon d'entrée et de sortie attendue comme vous semblez pour demander une solution à un problème qui n'existe pas.
- ok. merci ed. un sec.
- Est "sortie" au-dessus de la sortie que vous voulez ou de la sortie actuelle vous obtenez ce que vous ne voulez pas? Dans ce dernier cas, la sortie en voulez-vous?
- La sortie de "la version de l'interface", par la manière, venant de vous le mettre RS="version" et puis l'impression RS suivie par $1 $1 est "version" sur la première ligne de fichier2 vous obtenez cette sortie.
- ok... je m'attends à voir une sortie de toutes les lignes commençant par "interface" qui n'ont pas de lignes commençant par "arrêt" ou "description", à la suite jusqu'à la prochaine occurrence d'une ligne commençant par 'interface'. c'est le principe de cisco config - et je le veux pour imprimer toutes les interfaces qui ne sont pas fermées et n'ont pas de description.
Vous devez vous connecter pour publier un commentaire.
Essayer ce, compte tenu de votre 2 posté fichiers d'entrée:
Est-ce que vous cherchez? Notez qu'il est gawk-spécifique (avec l'aimable autorisation de
ENDFILE
) ce qui je suppose est très bien, puisque l'exemple de commande vous avez posté est également gawk-spécifique, mais si c'est un problème il suffit d'ajouter un test pour FNR==1 et le changement ENDFILE à la FIN: dePour tout le répertoire courant:
Si vous avez besoin de manière récursive dans les sous-répertoires:
Dans les deux cas, vous devriez probablement mettre
result.txt
dans un répertoire différent. Sinon, il sera adapté pour être utilisé comme fichier d'entrée. Ou utiliser un joker qui recherche uniquement les fichiers de votre choix, et ne correspond pas àresult.txt
.