2012-11-20 69 views
3

我想檢查文件內部是否匹配二進制模式。Bash匹配二進制模式

對於這一點,我使用ClamAV的簽名數據庫

Trojan.Bancos-166:1:*:3d415d736715ab5ee347238cacac61c7123fe35427224d25253c7b035558baf19e54e8d1a82742d6a7b37afc6d91015f751de1102d0a31e66ec33b74034b1ab471cc1381884dfdf0bb3e4233bd075fef235f342302ffd72ecabfa5aedf1b3dc99b3348346db4d9001026aef44c592fee61493f7262ad2bd1bce8a7ce60d81022533f6473ae184935f25cf6cc07c3aebfdf70a5a09139 

我這個代碼來檢索十六進制字符串表示簽名

signature=$(echo "$line" |awk -F':' '{ print $4 }') 

而且我改變十六進制字符串爲二進制

printf -v variable $(sed 's/\(..\)/\\x\1/g;' <<< "$signature") 

直到這裏它完美的作品。

最後,我想檢查我的文件(* $ raw_file_path *)(現爲$變量)我的二進制模式匹配 我試試這個

test_var=$(grep -qU "$variable" "$raw_file_path") 

test_var=$(grep -qU --regexp="$variable" "$raw_file_path") 

我不不知道爲什麼它不起作用,Grep不匹配任何東西 。 有時一些錯誤:

  • 的grep:斜槓

  • 的grep:無效的正則表達式

我知道它的模式匹配問題的交易。 在我的測試中,我不想使用正則表達式。

如果您有任何想法或其他bash工具。 謝謝。

+0

一起遵循@桑普森臣的回答,你「通過確認'$(...)'內部的內容是否正確工作,然後再添加將輸出保存到變量中的額外步驟,從而節省自己的痛苦。祝你好運。 – shellter

回答

2

通過在-qU中指定q,您當前正在使用--quiet選項來生成grep。這可以防止grep將任何內容打印到stdout,因此不會將任何內容保存到test_var

改變了代碼:

test_var=$(grep -UE "$variable" "$raw_file_path") 
+0

我不知道爲什麼,但它不起作用。 – user1778354

1

首先可避免額外的子shell:

#!/bin/bash 
signature="Trojan.Bancos-166:1:*:3d415d736715ab5ee347238cacac61c7123fe35427224d25253c7b035558baf19e54e8d1a82742d6a7b37afc6d91015f751de1102d0a31e66ec33b74034b1ab471cc1381884dfdf0bb3e4233bd075fef235f342302ffd72ecabfa5aedf1b3dc99b3348346db4d9001026aef44c592fee61493f7262ad2bd1bce8a7ce60d81022533f6473ae184935f25cf6cc07c3aebfdf70a5a09139" 
variable=$(echo "${signature//*:/}" | sed 's/\(..\)/\\x\1/g;') 

需要匹配的只有確認:

if grep -qU "$variable" "$raw_file_path"; then 
    # matches 
fi 

或要求進一步處理的結果:

test_var=$(grep -U "$variable" "$raw_file_path") 
# contents of match in test_var 

當返回到一個變量,裏grep -q選擇標準輸出

抑制編輯

測試工作示例

> signature="Trojan.Bancos-166:1:All_text before-the last : should be trimed:3d415d736715ab5ee347238cacac61c7123fe35427224d25253c7b035558baf19e54e8d1a82742d6a7b37afc6d91015f751de1102d0a31e66ec33b74034b1ab471cc1381884dfdf0bb3e4233bd075fef235f342302ffd72ecabfa5aedf1b3dc99b3348346db4d9001026aef44c592fee61493f7262ad2bd1bce8a7ce60d81022533f6473ae184935f25cf6cc07c3aebfdf70a5a09139" \ 
> hex_string=$(echo "${signature//*:/}" | sed 's/\(..\)/\\x\1/g;') \ 
> echo "$hex_string" 
\x3d\x41\x5d\x73\x67\x15\xab\x5e\xe3\x47\x23\x8c\xac\xac\x61\xc7\x12\x3f\xe3\x54\x27\x22\x4d\x25\x25\x3c\x7b\x03\x55\x58\xba\xf1\x9e\x54\xe8\xd1\xa8\x27\x42\xd6\xa7\xb3\x7a\xfc\x6d\x91\x01\x5f\x75\x1d\xe1\x10\x2d\x0a\x31\xe6\x6e\xc3\x3b\x74\x03\x4b\x1a\xb4\x71\xcc\x13\x81\x88\x4d\xfd\xf0\xbb\x3e\x42\x33\xbd\x07\x5f\xef\x23\x5f\x34\x23\x02\xff\xd7\x2e\xca\xbf\xa5\xae\xdf\x1b\x3d\xc9\x9b\x33\x48\x34\x6d\xb4\xd9\x00\x10\x26\xae\xf4\x4c\x59\x2f\xee\x61\x49\x3f\x72\x62\xad\x2b\xd1\xbc\xe8\xa7\xce\x60\xd8\x10\x22\x53\x3f\x64\x73\xae\x18\x49\x35\xf2\x5c\xf6\xcc\x07\xc3\xae\xbf\xdf\x70\xa5\xa0\x91\x39 
+0

我並不總是*後面跟: – user1778354

+0

只要您簽名前,它就會發揮作用//指定最長匹配後跟任意字符*和:最後一行之前的所有內容:和包括:會被刪除。 – koola

+0

我不知道爲什麼,但它不起作用 – user1778354