2016-03-08 20 views
0

我正在编写一个小型bash脚本,它将搜索一个字符串,对其进行解码,然后回显结果。然而,我解析日志文件是在以下结构:使用awk返回相应的列

<filename/path to file> <signature> 

到目前为止,我只提取签名,带他们通过正则表达式,然后解码任何已经匹配了正则表达式。我也想输出相当于我grepped像这样的签名文件:

<filename/path to file> <decoded signature> 
<filename/path to file> <decoded signature> 

什么我的电流输出一样如下:

<decoded signature> 
<decoded signature> 

这里是我的脚本:

#!/bin/bash 

read -p $'\e[1;33mLogfile\e[0m: ' sigs 

parse=$(awk 'NF > 1 {print $2}' "$sigs") 

Array=($(grep -ra "$parse" /var/lib/clamav | grep -oP "(?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}])")) 

for hex in "${Array[@]}"; do 
     converted="$(xxd -r -p <<< "$hex")" 
     echo -e "\e[92m$converted \e[0m" 
done 

如果我将日志文件的所有内容存储在一个数组中,其中的元素将是文件名和密钥的解码签名,这是一个好主意吗?

UPDATE

日志文件(LOGFILE.TXT) - >什么我解析;

/public_html/n0g6v/content/execution-after-redirect.html: {LDB}VT-malware33.UNOFFICIAL FOUND 
/public_html/n0g6v/paypal-gateway.html: Html.Exploit.CVE.2015_6073 

/var/lib/clamav/daily.cld - >在那里我得到签名HEX值解码;

Html.Exploit.CVE_2015_6073;Engine:51-255,Target:3;0&1;696e7365727461646a6163656e7468746d6c;6164646576656e746c697374656e6572{-30}646f6d6e6f646572656d6f766564*737761706e6f6465 

=========================================== ==============

样品输入:

logfile.txt 

输出:

/public_html/n0g6v/content/execution-after-redirect.html: 
/public_html/n0g6v/paypal-gateway.html: 
insertadjacenthtml 
------------------------------------------------------------------------------- 

/public_html/n0g6v/content/execution-after-redirect.html: 
/public_html/n0g6v/paypal-gateway.html: 
addeventlistener 

============= ============================================

如何,我想它是:

样品输入:

logfile.txt 

输出:

/public_html/n0g6v/content/execution-after-redirect.html: 
<No match found for this signature> 
/public_html/n0g6v/paypal-gateway.html: 
insertadjacenthtml 
addeventlistener 
+0

显示一些具体的(真实或现实的假)输入和所需的输出。我敢打赌,你会得到一个或几个答案,只需awk即可轻松完成整个任务。 – jas

+0

谢谢。对样本输入/输出和预期样​​本进行了更新。 – McJohnson

回答

0

awk来救援!

如果您的查找文件不是很大,请加载到awk数组中并从日志文件中搜索字段2(如果找到),请调用您的转换脚本并打印结果。

例如,该代码应该清楚..

$ awk 'NR==FNR{split($0,a,";"); 
       lookup[a[1]]=$0; next} 
       {inlookup=$2 in lookup; 
       print $2; 
       if(!inlookup) 
       {print "<No match found for this signature>"; 
        next} 
       } 
       {split(lookup[$2],h,";"); 
       for(i=4;i<=length(h);i++) 
        {cmd="wc -c <<< \"" h[i] "\""; 
        cmd | getline d; print d, h[i]}}' daily logfile 

{LDB}VT-malware33.UNOFFICIAL 
<No match found for this signature> 
Html.Exploit.CVE_2015_6073 
37 696e7365727461646a6163656e7468746d6c 
83 6164646576656e746c697374656e6572{-30}646f6d6e6f646572656d6f766564*737761706e6f6465 

在这里,而不是解码我做wc -c但同样的原则也适用。还请注意,由于._不匹配,给定的两个文件的值不匹配,因此需要修复打印错误以使其起作用。

+0

我很抱歉,请你详细说明一下吗?我试图通过控制台运行并使用完整路径重命名文件,但无法正确执行。得到:'awk:cmd。行:1:(FILENAME =/var/lib/clamav/daily.cld FNR = 1793447)fatal:dupnode:r-> stptr:无法分配61个字节的内存(无法分配内存)。我的主要观点是自动化这个过程,我认为单个脚本可以做得很好,而不是包含/调用处理其不同部分的外部脚本。 – McJohnson

+0

“如果你的查找文件不是很大”则不适用。它不适合你的记忆,所以你需要另一种方法。这awk脚本可能已经完全取代你的bash脚本,但唉... – karakfa

+0

嗯,我只需要回显出相应签名的文件名,所以我不明白为什么我不得不用完全不同的方法替换整个脚本。 – McJohnson