2016-04-11 23 views
0

ile çıktı ... biçimlendirme Ben metnin bu tür var:yardımına ihtiyacım sed komutu

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 

ve ihtiyacım çıkış, birinci ve ikinci sütun ve socialSecurityNumber VEYA tng-müşteri kimliği (bir):

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 

Yani sorum ... o sed komutuyla bu sorunu çözmek mümkün mü? Burada OR seçeneğine ihtiyacım var. Öncelikle, ayrı ayrı bunu denerseniz

, socialSecurityNumber bulmak, bu alın:

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 

: ikinci olarak

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 

, tng-müşteri kimliği bulmak, bu alın Yani, eğer görebiliyorsanız, ilk örnekte, sosyalSecurityNumber iki son satırda bulunmazsa, sadece onları basar. İkinci örnekte aynı durum ...

Ben ile benim sed komutu complect deneyin VEYA operatör tamamen yanlıştır bu çıktıyı almak

: Ben olduğum şey ...

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 

Yani yanlış mı yapıyorsun?

cevap

1

bunu kullanın sed:

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

Testi: Emriniz itibaren

$ 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 

: Bekarım dış göre gruplandırılmış olan her gruba en .* kaldırdık

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

grubudur. Böylece, eşsiz dize gruplandırılmayacak.

+0

Vay, çok teşekkürler! Ben sadece size bir çözüm getirdim ve: 'wsslogfetcher ~/temp/log_parser $ sed 's/\ ([^ +] * \). * \ (" SocialSecurityNumber ":" [^,] * \ | tng-customer- id = [^] * \). */\ 1 \ 2/'testfile.txt' Yani ... o da çalışıyor – sergei

+0

@sergei, Çalıştığına sevindim. – sat