2017-05-07 7 views
0

Ich habe eine Protokolldatei auf meinem Computer gespeichert, die ich ein Skript zum Parsen erstellen möchte. Mein Ziel ist es, zwei Werte aus jeder Zeile der Protokolldatei zu ziehen und sie dann nebeneinander (möglicherweise mit Bindestrich getrennt) in derselben Zeile auszugeben und dann für jede Zeile innerhalb des Protokolls zu durchlaufen. Zum Beispiel können die folgenden Protokolle:Ausgabe von zwei bash loop Ergebniswerte auf die gleiche Zeile?

123-abc-thething01, 6, 1234, metadata, metadata, [email protected], metadata, 123abc 
123-abc-thething02, 6, 1234, metadata, metadata, [email protected], metadata, 123abc 
123-abc-thething03, 6, 1234, metadata, metadata, [email protected], metadata, 123abc 

Nachdem das Skript ausgeführt wird hoffentlich erreichen ...

123-abc-thething01 - [email protected] 
123-abc-thething02 - [email protected] 
123-abc-thething03 - [email protected] 

Im Moment habe ich den folgenden Code, die die richtigen Werte zieht, aber es ist Geben Sie einfach alle 'var1' und dann alle 'var2' wie unten gezeigt aus, anstatt Zeile für Zeile durchzugehen, geben Sie var1 und var2 Werte für Zeile 1 in einer einzelnen Zeile aus, dann var1 und var2 für Zeile 2 in einer neuen Zeile ETC

Ich habe einige Zeit versucht, verschiedene Möglichkeiten, dies zu tun, aber ich bin ein wenig ratlos. Ich bin im Moment nicht sehr stark mit bash, also würde jede Hilfe sehr geschätzt werden. Vielen Dank.

#!/bin/bash 

for i in logfile.txt 
do 
    var1=$(cat logfile.txt | awk '{print $1}' | sed 's/,//g') 
    var2=$(cat logfile.txt | grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*') 
done 

echo ${var1} 
echo ${var2} 
+1

Sie sollten keine Shell-Skripte verwenden, um Textdateien zu analysieren, zum Beispiel könnte dies nur mit awk 'awk -F, '{print $ 1' - $ 6} 'Datei' – 123

+0

durchgeführt werden perl 'perl -ne 'drucke" $ 1 - $ 2 \ n "wenn /([^,]+).*, ([[: alnum:] ._-] + @ [[: alnum:] ._-] +)/'' – 123

+0

Danke! Das ist praktisch, ich denke, ich werde mit diesem Ansatz gehen. – Dronzil

Antwort

1

Mit bash:

#!/bin/bash 

while IFS="," read -r -a array 
do 
    # remove leading white space from element 5 
    echo "${array[0]} - ${array[5]/# /}" 
done < logfile.txt 

Ausgang:

 
123-abc-thething01 - [email protected] 
123-abc-thething02 - [email protected] 
123-abc-thething03 - [email protected] 

Verwenden Sie möglichst awk für diesen Job.

+0

Hallo Cyrus, danke dafür Es ist wirklich hilfreich! Ich hätte wahrscheinlich erwähnen sollen, dass die E-Mail-Adressen an jeder Position innerhalb jeder Log-Zeile sein können und nicht nur auf Position 5 (mein Schlechter) sind. Deshalb wollte ich Regex verwenden, aber hätten Sie unter diesen Umständen einen Vorschlag? Danke – Dronzil

+0

Warum sollten Sie ein kurzes, effizientes awk-Skript in eine Lese-Schleife ändern? – 123

+0

@Dronzil Der einzige Teil einer E-Mail-Adresse, der zuverlässig mit einer Regex verglichen werden kann, ist das '@'. Alles, was Sie sonst noch in einen E-Mail-Regex schreiben, kann an gültigen Adressen fehlschlagen. Wenn dies reale Adressen behandelt, die Benutzer einreichen, benötigen Sie eine andere Möglichkeit, zu verfolgen, in welchem ​​Feld sich die Adresse befindet. – ccarton

1

Verwendung awk:

awk -F', ' '{printf "%s - %s\n", $1, $6}' log.file 
+1

Dies wird einen zusätzlichen Platz vor $ 6 – 123

+0

Messepunkt haben. Änderte es. – hek2mgl

Verwandte Themen