2016-04-11 23 views
0

ich brauche Ihre Hilfe ... habe ich diese Art von Text:Formatierung der Ausgabe mit sed Befehl

2016.04.10 19:24:00,044 +0300 basdahsdjashd asjd ashdjkl [{"socialSecurityNumber":"68888410106514","socialSecurityNumberCountryCode":"EE"}] 
2016.04.07 14:29:09,126 +0300 jsjdgdbcgf jjsgftr kksgcxdw2 [{"socialSecurityNumber":"00299288282224","socialSecurityNumberCountryCode":"EE"}] 
2016.04.05 22:01:32,005 +0300 jafhaljdhf afs ljhsdhfl adf tng-customer-id=9303801442 
2016.04.05 20:44:51,003 +0300 pppcndhfgus23 ofkgjg jdghhfye uksd tng-customer-id=2875223046 

und der Ausgang I müssen (erste und zweite Spalte und Social OR tng-Kunden-ID):

Also die Frage ist ... ist es möglich, dieses Problem mit sed Befehl zu lösen? Ich brauche hier die Option OR.

Wenn ich versuche, sie separat zu tun, erstens, die Social finden, bekomme ich diese:

wsslogfetcher ~/temp/log_parser$ sed 's/\([^+]*\).*\("socialSecurityNumber"[^,]*\).*/\1 \2/' testfile.txt 
2016.04.10 19:24:00,044 "socialSecurityNumber":"68888410106514" 
2016.04.07 14:29:09,126 "socialSecurityNumber":"00299288282224" 
2016.04.05 22:01:32,005 +0300 jafhaljdhf afs ljhsdhfl adf tng-customer-id=9303801442 
2016.04.05 20:44:51,003 +0300 pppcndhfgus23 ofkgjg jdghhfye uksd tng-customer-id=2875223046 

zweitens die tng-Kundennummer finden, bekomme ich diese:

wsslogfetcher ~/temp/log_parser$ sed 's/\([^+]*\).*\(tng-customer-id[^ ]*\).*/\1 \2/' testfile.txt 
2016.04.10 19:24:00,044 +0300 basdahsdjashd asjd ashdjkl [{"socialSecurityNumber":"68888410106514","socialSecurityNumberCountryCode":"EE"}] 
2016.04.07 14:29:09,126 +0300 jsjdgdbcgf jjsgftr kksgcxdw2 [{"socialSecurityNumber":"00299288282224","socialSecurityNumberCountryCode":"EE"}] 
2016.04.05 22:01:32,005 tng-customer-id=9303801442 
2016.04.05 20:44:51,003 tng-customer-id=2875223046 

Wenn Sie also sehen können, dass im ersten Beispiel die socialSecurityNumber nicht in zwei letzten Zeilen gefunden wird, werden sie nur ausgedruckt. Im zweiten Beispiel der gleiche Situation ...

Wenn ich versuche, meinen sed Befehl complect mit OR-Operator ich diese Ausgabe zu erhalten, die völlig falsch ist:

wsslogfetcher ~/temp/log_parser$ sed 's/\([^+]*\).*\(\("socialSecurityNumber"[^,]*\).*\|\(tng-customer-id=[^ ]*\).*\)/\1 \2/' testfile.txt 
2016.04.10 19:24:00,044 "socialSecurityNumber":"68888410106514","socialSecurityNumberCountryCode":"EE"}] 
2016.04.07 14:29:09,126 "socialSecurityNumber":"00299288282224","socialSecurityNumberCountryCode":"EE"}] 
2016.04.05 22:01:32,005 tng-customer-id=9303801442 
2016.04.05 20:44:51,003 tng-customer-id=2875223046 

Also ... was ich bin falsch machen?

Antwort

1

verwenden sed:

sed 's/^\([^ ]*\) \([^ ]*\).*\("socialSecurityNumber":"[^"]*"\|tng-customer-id=[^ ]*\).*$/\1 \2 \3/g' file 

Test:

$ sed 's/^\([^ ]*\) \([^ ]*\).*\("socialSecurityNumber":"[^"]*"\|tng-customer-id=[^ ]*\).*$/\1 \2 \3/g' a 
2016.04.10 19:24:00,044 "socialSecurityNumber":"68888410106514" 
2016.04.07 14:29:09,126 "socialSecurityNumber":"00299288282224" 
2016.04.05 22:01:32,005 tng-customer-id=9303801442 
2016.04.05 20:44:51,003 tng-customer-id=2875223046 

Von Ihrem Befehl:

sed 's/\([^+]*\).*\(\("socialSecurityNumber"[^,]*\)\|\(tng-customer-id=[^ ]*\)\).*/\1 \2/' 

I .* in jeder Gruppierung entfernt haben, die durch äußere Einzel gruppiert Gruppe. Daher wird die nicht übereinstimmende Zeichenfolge nicht gruppiert.

+0

Wow, vielen Dank! Ich habe nur Ihre Lösung geändert und bekam: 'wsslogfetcher ~/temp/log_parser $ sed 's/\ ([^ +] * \). * \ (" SocialSecurityNumber ":" [^,] * \ | tng-customer- id = [^] * \). */\ 1 \ 2/'testfile.txt' Also ... es funktioniert auch .. – sergei

+0

@sergei, Froh, es hat funktioniert. – sat