【问题标题】:Bash matching binary patternBash 匹配二进制模式
【发布时间】:2012-11-20 18:54:11
【问题描述】:

我想检查文件内部是否匹配二进制模式。

为此,我正在使用 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*)是否与我的二进制模式匹配(现在在 $variable 中) 我试试这个

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

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

我不知道为什么它不起作用,Grep 不匹配任何东西 . 有时还会出现一些错误:

  • grep:尾部反斜杠

  • grep:正则表达式无效

我知道它处理模式匹配问题。 在我的测试中,我不想使用正则表达式。

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

【问题讨论】:

  • 继续@Sampson-chen 的回答,在添加将输出保存到多变的。祝你好运。

标签: linux bash grep


【解决方案1】:

您当前正在使用grep--quiet 选项,方法是在-qU 中指定q。这可以防止grep 将任何内容打印到stdout,因此不会将任何内容保存到test_var

将您的代码更改为:

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

【讨论】:

    【解决方案2】:

    首先可以避免额外的子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
    

    返回变量时,greps -q opt 抑制标准输出

    编辑

    经过测试的工作示例

    > 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
    

    【讨论】:

    • 我并不总是 * 后跟:
    • 只要你在签名之前有 : ,它就可以工作 // 指示最长匹配后跟任何字符 * 和 : 最后一个 : 之前的所有内容,包括 : 被删除。
    • 这是关于 grep 函数的。未检测到模式或检测到所有文件。
    • 尝试添加-o --binary-files=binary 或指定-a,它将二进制文件当作文本处理。
    猜你喜欢
    • 2013-01-01
    • 2012-07-03
    • 1970-01-01
    • 2014-03-07
    • 2018-10-04
    • 1970-01-01
    • 2011-12-09
    • 2011-11-09
    • 2023-03-25
    相关资源
    最近更新 更多