尝试使用 awk 和 sed 对文件进行迭代操作



我有一行,可以拉出文件中漏洞一词后面出现严重性的次数

请不要笑得太厉害:

cat <file> | sed '1,/vulnerabilities/d' | grep -c '"severity": 4'

这将返回"严重性"计数:文件中有 4 个匹配项。 我似乎无法在其他文件中迭代它。

我有 100 个左右的文件,格式为 bleeblah-082017。 其中 bleeblah 可以是不同的长度和单词。 我在如何轻松地从上面的一个文件迭代以分别从每个文件中获取结果方面遇到了问题。

我通常会使用 awk 行来遍历列表,但我似乎找不到任何示例来融合 awk 和 sed。

有人对如何对多个文件执行上述任务并返回每个文件的结果有任何想法吗?

谢谢 戴维

我有一个文件,其中包含一堆条目,例如:
{ "计数": 6,">
plugin_family": "杂项", "plugin_id":7467253, "plugin_name": "废话", "严重性": 4, "severity_index": 1, "vuln_index":13

我想提取时间"严重性":每个文件中漏洞一词后出现 4。 输出将为 10

更多输入文件。

"notes": null,
"remediations": {
"num_cves": 20,
"num_hosts": 6,
"num_impacted_hosts": 2,
"num_remediated_cves": 6,
"remediations": [
{
"hosts": 2,
"remediation": "Apache HTTP Server httpOnly Cookie Information Disclosure: Upgrade to Apache version 2.0.65 / 2.2.22 or later.",
"value": "f950f3ddf554d7ea2bda868d54e2b639",
"vulns": 4
},
{
"hosts": 2,
"remediation": "Oracle Application Express (Apex) CVE-2012-1708: Upgrade Application Express to at least version 4.1.1.",
"value": "2c07a93fee3b201a9c380e59fa102ccc",
"vulns": 2
}
]
},
"vulnerabilities": [
{
"count": 6,
"plugin_family": "Misc.",
"plugin_id": 71049,
"plugin_name": "SSH Weak MAC Algorithms Enabled",
"severity": 1,
"severity_index": 0,
"vuln_index": 15
},
{
"count": 6,
"plugin_family": "Misc.",
"plugin_id": 70658,
"plugin_name": "SSH Server CBC Mode Ciphers Enabled",
"severity": 1,
"severity_index": 1,
"vuln_index": 13
},
{
"count": 2,
"plugin_family": "Web Servers",
"plugin_id": 64713,
"plugin_name": "Oracle Application Express (Apex) CVE-2012-1708",
"severity": 2,
"severity_index": 2,
"vuln_index": 12
},

其中每个文件都来自从我的扫描程序 API 中提取的漏洞扫描。 从本质上讲,严重性这个词在不同方面(主机、漏洞等(无处不在。 我想从每个扫描文件中提取该模式在单词漏洞之后出现的次数(在每个文件中只出现一次(。 愿意使用perl python来实现这一点。 只是过去更熟悉 shell 脚本来操作这些文本类型文件。

使用sedawk解析.json数据充满了潜在的陷阱。我建议使用格式感知工具(如jq(来查询所需的数据。 在这种情况下,您可以执行以下操作

jq '{(input_filename): [.vulnerabilities[].severity]|add}' *.json

这应该产生类似

{
"bleeblah-201708.json": 4
}
{
"bleeblah-201709.json": 11
}

使用jq在命令行上解析json。它是标准工具。使用基于文本的工具(如sed(来解析 json 是非常脆弱的,因为它依赖于元素的顺序和 json 文档的格式,这不能保证或 json 标准的一部分。

您要查找的是以下命令:

jq '[.vulnerabilities[]|select(.severity==4)]|length' file.json

如果要为多个文件运行它,请使用find

find FOLDER -name 'PATTERN.json' -print 
-exec jq '[.vulnerabilities[]|select(.severity==4)]|length' {} +

我制作了以下两个示例文件,假设它们可以代表您拥有的内容。请注意搜索文本在"漏洞"之前和之后的出现次数,之后出现的次数不同。 从您的代码中,我假设搜索字符串最多只会在一行上出现一次,这些行将被计算在内。

BLABLEH-082017:

"severity" : 4 
"severity" : 4 
vulnerabilities
"severity" : 4 
"severity" : 4

布利布拉-082017:

"severity" : 4 
"severity" : 4 
vulnerabilities
"severity" : 4 
"severity" : 4 
"severity" : 4 

这是我的建议,除了 sed 和 grep 之外,还使用 find 来实现-exec内部所需的管道。

find . -iname "*-082017"  -print -exec sh -c "sed  1,/vulnerabilities/d {} | grep -c '"severity" : 4'" ;

输出(希望名称行和计数行没问题,否则另一个 sed 可以为您重新格式化(:

./blableh-082017
2
./bleeblah-082017
3

详:

  • 使用 find 处理多个文件并将每个文件名获取到输出中,
    尽管 seds 缺乏对此的支持
  • 基本上使用您的代码通过 SED 进行切割并通过 grep 进行计数
  • 将文件名作为参数提供给 sed,而不是通过 cat 的管道
  • -exec中使用sh来实现管道
    (由 devnull 回答如何在 -exec 中使用管道(

环境:

  • GNU sed 版本 4.2.1
  • GNU bash, version 3.1.23(1(-release (i686-pc-msys(
  • GNU grep 2.5.4
  • find (GNU findutils( 4.4.2

最新更新