web-dev-qa-db-fra.com

Analyser avec Awk

nouveau sur Ubuntu, désolé si cela a déjà été demandé, mais je voudrais un moyen d’analyser un fichier texte qui a un format général de:

-------- step 0  ---- cpu =     Time_value  -------
Energy =  Energy_value1   KinEng = KinEng_value1 Temp = Temp_value1

-------- step 10 ---- cpu =     Time_value  -------
Energy =  Energy_value2   KinEng = KinEng_value2 Temp = Temp_value2

Plus précisément, j'essayais de comprendre comment utiliser awk et/ou grep pour extraire la valeur time et temp_value et les exporter dans un fichier dans des colonnes individuelles

Time_value1 Temp_value1
Time_value2 Temp_value2
etc...

En regardant la documentation awk, j'ai trouvé que awk '/Temp/ {print $9}' file_name me donnait la valeur temp et que awk '/cpu/ {print $7}' file_name me donnait la valeur time_value mais comment puis-je rechercher les deux chaînes dans une commande tout en cherchant des colonnes différentes pour leurs chaînes respectives. En d'autres termes, comment puis-je modifier la ligne awk '/cpu|sec/ {print}' file_name pour inclure les informations de colonne de chaque chaîne.

@steeldriver: le fichier texte est encore plus difficile à lire dans un éditeur réel à cause de son format, mais je vais joindre une capture d'écran de sa vue la plus "propre".

enter image description here

1
Jonathan Tran

La awk que vous voulez devrait être comme suit:

awk -F '=' '/^-/{gsub(/\-*$/,"",$2);print $2}' input.txt

L'idée ici est que nous utilisons = comme séparateur de colonnes (ou dans la terminologie awk). En tant que tel, dans la ligne contenant le temps CPU que vous souhaitez, vous n’avez qu’un =, ce qui ferait tout ce qui se trouvait à gauche dans le fichier $1 et à sa droite - $2.

Après cela, c'est la structure simple /PATTERN/ {ACTION}. Seules les lignes correspondant au motif de départ avec un tiret auront les tirets de fin coupés, puis ce qui reste est le temps CPU.

0
Sergiy Kolodyazhnyy

Vos "unités" sont des groupes de 5 lignes. Dans cette situation, il peut être utile de:

awk '{print $1, $11}' RS="cpu =" logfile

RS="cpu =" redéfinit le séparateur d'enregistrement (RS) en tant que "cpu =". Ensuite, il ne reste plus qu'à imprimer les champs souhaités

0
user216043