我正在尝试编写一个简单的bash脚本,该脚本将grep二进制文件中的字符串,然后使用正则表达式提取所有十六进制字符串。但是,我似乎无法找到一种方法,我可以将正则表达式的输出存储在一个数组中,以后我可以将其所有元素从十六进制转换为ASCII值。
str=$(grep -ra "Html.Exploit.CVE.2015_6073" /var/lib);
hexstr=$([[ $STR =~ (?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}]) ]]);
converted=$(xxd -r -p <<< "$HEXSTR");
echo -e "\e[92m$converted \e[0m"
我可以在if
语句中使用while
循环创建一个包含十六进制字符串(从正则表达式返回)作为元素的数组吗?
当前代码:
#!/bin/bash
str=$(grep -ra "Html.Exploit.CVE.2015_6073" /var/lib);
if [[ $str =~ (?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}]) ]]; then
Array+="$str"
fi
for hex in "${Array[@]}"; do
echo $hex
done
答案 0 :(得分:3)
您可以在bash中为数组添加值:
Array+=("$hexstr")
然后你可以像这样遍历数组:
for hex in "${Array[@]}"; do
#perform operation to convert hex here
converted="$(xxd -r -p <<< "$hex")"
done
要纠正if match
逻辑,您可以这样做一个语句,以便设置$hexstr
变量。
if [[ $STR =~ (?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}]) ]]; then
hexstr="$STR"
fi
将它们放在一起看起来像这样:
if [[ $STR =~ (?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}]) ]]; then
Array+=("$STR")
fi
###Do work
###Use For loop etc
如果你想进一步缩短你的代码(减少代码破坏的机会),你可以在grep中完成所有匹配并添加到数组中:
Array=($( grep -ra "Html.Exploit.CVE.2015_6073" /var/lib | grep -oP "(?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}])"))
##Do For loop
上面将执行你的grep并找到匹配的行,然后它只获得正则表达式的匹配值并将每个存储在数组中。