2009-10-02 14 views
2

J'ai créé un script awk et l'utiliser comme ceci:Comment puis-je réduire cette ligne de commande bash dans une instruction awk?

# grep -E "[PM][IP][DO][:S]" file.txt | awk-script 

Comment puis-je modifier le script awk pour inclure l'effort de la commande grep (qui est à la recherche pour les deux « PID: » ou « MPOS ? »

awk-script est:

#!/usr/bin/awk -f 
/Sleeve/ { 
     printf("%8d, %7d, %7.2f, %7.2f, %7.2f\n", $5, $6, $7, $30, $31) 
} 
/Ambient/ { 
     printf("%8d, %7d,,,, %7.2f, %7.2f\n", $5, $6, $7, $8) 
} 
/MPOS:/ { 
     printf("%8d, %7d,,,,,, %5d, %5d\n", $4, $5, $2, $3) 
} 
+0

Compte tenu de votre commentaire à la réponse litb, pourquoi ne pas nous montrer quelques échantillons input (inclure les lignes qui devraient et ne devraient pas correspondre). –

Répondre

2

Si vous voulez juste pour rechercher PID: ou MPOS, vous pouvez dire que si vous ne les trouver dans la ligne, vous voulez sauter les règles suivantes:

#!/usr/bin/awk -f 

!/PID:|MPOS/ { 
     next 
} 

/Sleeve/ { 
     printf("%8d, %7d, %7.2f, %7.2f, %7.2f\n", $5, $6, $7, $30, $31) 
} 
/Ambient/ { 
     printf("%8d, %7d,,,, %7.2f, %7.2f\n", $5, $6, $7, $8) 
} 
/MPOS:/ { 
     printf("%8d, %7d,,,,,, %5d, %5d\n", $4, $5, $2, $3) 
} 
+0

Cela a fonctionné dans ubuntu en utilisant l'authentique 'awk', mais dans mon environnement embarqué (où grep et awk sont des implémentations 'busybox'), j'ai toujours du chagrin. J'ai essayé même en remplaçant le match "/ Sleeve /" avec "/PID:.*Sleeve/" sans succès. Je suis coincé (pas de difficultés) pour l'instant en utilisant ma ligne de commande d'origine. – Jamie

+0

Si '!/PID: | MPOS /' ne fonctionne pas, essayez '! (/ PID:/||/MPOS /) {next}' –

+0

Je dois préciser que la syntaxe 'litb' proposée est correcte - il y a quelque chose dans mon fichier d'entrée qui provoque le comportement du script de manière imprévisible. Les fichiers de test simples montrent les travaux suggérés du script 'litb' (dans busybox et autres). – Jamie

2

J'ai essayé litb réponse busybox (sur Ubuntu en Bash) et cela a fonctionné pour moi. Pour les tests, je le tralala qui suit pour correspondre où j'ai des liens symboliques à busybox:

#!/home/username/busybox/awk -f 

et a couru le test en utilisant:

./awk-script file.txt 

J'ai aussi couru le test sous busybox sh (avec PATH=/home/username/busybox:$PATH mais pas nécessaire pour cela) et cela a marché là-bas.

Lorsque vous dites "j'ai encore du chagrin". Qu'est-ce que ça veut dire? Recevez-vous des messages d'erreur ou des résultats incorrects?

Par ailleurs, à moins que vous recherchez toutes les permutations des personnages, vous pouvez faire votre grep comme ceci:

grep -E "(PID:|MPOS)" file.txt 
+0

La syntaxe est bonne, elle tronque juste la sortie à quelques dizaines de lignes au lieu de 10K plus que ce que j'attends (en cours d'exécution dans le système embarqué). Les fichiers de script et de test sont identiques et la ligne de commande a été coupée et collée entre les deux environnements. Donc par «chagrin», je veux dire que j'obtiens des résultats agréables et longs dans Ubuntu, et des résultats tronqués plaisants dans l'embarqué. Je suis à peu près certain qu'il y a quelque chose dans le fichier qui est la cause qui pourrait avoir été introduit dans le transfert entre les systèmes. Pas important, le grep fonctionne bien. (+1 pour le pourboire de grep). – Jamie