2016-04-11 145 views
0

输出我需要你的帮助...... 我得到了这样的文字:格式化用sed命令

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 

,我需要的输出(第一和第二列和socialSecurityNumber的OR TNG-客户ID ):

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 

所以问题是......有可能用sed命令解决这个问题吗?我需要OR选项。

如果我尝试单独做到这一点,首先,找到socialSecurityNumber的,我得到这个:

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-客户ID,我得到这个:

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 

所以,如果你能看到,在第一个例子中,当最后两行中没有找到socialSecurityNumber时,它只是将它们打印出来。在第二个例子中,同样的情况......

当我试图编造我的sed的命令或操作我得到这个输出,这是完全错误的:

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 

所以...我什么做错了?

回答

1

使用此sed

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

测试:

$ 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 

从你的命令:

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

我已经在由外单分组每个分组取出.*组。所以,不匹配的字符串将不会被分组。

+0

哇,非常感谢!我只是修改了你的解决方案,得到: 'wsslogfetcher〜/ temp/log_parser $ sed's/\([^ +] * \)。* \(“socialSecurityNumber”:“[^,] * \ | tng-customer- id = [^] * \)。*/\ 1 \ 2 /'testfile.txt' 所以...它也可以。 – sergei

+0

@sergei,很高兴工作。 – sat