从日志中grep特定文本

时间:2012-10-03 10:05:09

标签: sed grep

我试着弄清楚如何在linux中只使用以下日志中的“SIG:”哈希部分:

20120927:10:57:23|89252871|3342|ESP individual score details for Message ID: <esp:msgid> -|<RBL:<0>  SHA:<0>  SHA_FLAGS:<0>  UHA:<12>  ISC:<0>  BAYES:<0>  SenderID:<0>  DKIM:<0>  TS:<-1>  SIG:<309875857436-4372-986476-327698-7436-984376-43276-98437643-8276-84327-6743-6874-986-86743-86732-867432-687432-687>  DSC:<0>  ('TRU_spam1', 47):<0> ('TRU_legal_spam', 31):<0> ('TRU_marketing_spam', 34):<0> ('TRU_profanity_spam', 39):<0> ('TRU_medical_spam', 35):<0> ('TRU_playsites', 46):<0> ('TRU_money_spam', 37):<0> ('TRU_stock_spam', 41):<0> ('TRU_embedded_image_spam', 27):<0> ('TRU_urllinks', 49):<0> ('TRU_watch_spam', 42):<0> ('TRU_phish_spam', 38):<0> ('TRU_spam2', 48):<0> ('TRU_misc_spam', 36):<0> ('TRU_LOREAL', 55):<0> ('TRU_freehosting', 45):<0> ('TRU_lotto_spam', 32):<0> ('TRU_ru_spamsubj', 56):<0> ('TRU_adult_spam', 18):<0> ('URL Real-Time Signatures', 9):<0> ('TRU_scam_spam', 40):<0>:89252871>|

最终观点:

309875857436-4372-986476-327698-7436-984376-43276-98437643-8276-84327-6743-6874-986-86743-86732-867432-687432-687

5 个答案:

答案 0 :(得分:3)

使用Perl正则表达式(适用于GNU grep):

grep -oP '(?<=SIG:<)[^>]*(?=>)'

答案 1 :(得分:2)

grep一个人在这里帮助不了多少。您可以将cut添加到工具箱中:

grep -o 'SIG:<[^>]\+' | cut -f2 -d\<

首先,选择SIG及其后的所有内容,直至>。然后,只返回第一个<之后的内容。

答案 2 :(得分:1)

sed 's/.*SIG:<\([^>]\+\)>.*/\1/g' INPUTFILE

可能会为你工作

答案 3 :(得分:1)

awk '{for(i=1;i<=NF;i++)if($i~/SIG:/){gsub("SIG:<","",$i);gsub(">","",$i);print $i;break}}' your_file

答案 4 :(得分:1)

使用两个greps,一个用于抓取正确的字段,另一个用于清理:

<infile grep -o 'SIG:<[^>]*' | grep -o '[^<]*$'