1

我试图弄清楚如何在 linux 中仅 grep 来自该日志的“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
4

5 回答 5

3

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

grep -oP '(?<=SIG:<)[^>]*(?=>)'
于 2012-10-03T10:20:26.030 回答
2

grep一个人在这里帮不了你太多。您可以添加cut到您的工具箱:

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

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

于 2012-10-03T10:17:36.863 回答
1
sed 's/.*SIG:<\([^>]\+\)>.*/\1/g' INPUTFILE

可能对你有用

于 2012-10-03T10:16:22.647 回答
1

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

<infile grep -o 'SIG:<[^>]*' | grep -o '[^<]*$'
于 2012-10-03T11:57:48.020 回答
1
awk '{for(i=1;i<=NF;i++)if($i~/SIG:/){gsub("SIG:<","",$i);gsub(">","",$i);print $i;break}}' your_file
于 2012-10-03T10:23:23.837 回答