2017-08-16 60 views
0

我已經得到了翻出次數字嚴重性Word中的漏洞出來後在一個文件中試圖反覆使用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腳本來操縱這些文本類型文件。

+3

這真的是不完全清楚,我你想實現作爲第一個語句是什麼有點模棱兩可。我可以建議你包含一個(小)樣本輸入文件和你期望的輸出嗎? –

+1

我也不明白你的問題。該行是JSON。你應該更好地使用Perl或Python來解析(也可以過濾它)。至少有一個oneliner使其成爲多行。你在談論「遍歷列表」 - 「」包含這些JSON對象在每行中嗎?並且:「彙編awk和sed」你可以單獨使用'awk'來執行任何sed操作。顯示一個包含單詞「漏洞」的例子''。 –

+0

添加更多上下文輸入行 – RomanPerekhrest

回答

-1

我已經做了以下兩個示例文件,假設他們可以代表你擁有的東西。請注意,「漏洞」之前和之後的搜索文本的發生次數不同,發生次數不同。 從您的代碼我假設搜索字符串將只在一行上最多一次,行將被計數。

blableh-082017:

"severity" : 4 
    "severity" : 4 

vulnerabilities 

"severity" : 4 
    "severity" : 4 

bleeblah-082017:

"severity" : 4 
    "severity" : 4 
vulnerabilities 

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

這裏是我的建議,使用find除了sed和grep的,也用sh實現內部-exec所需管道。

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

輸出(希望的名稱線和計數線都OK,否則你另一個sed的coudl重新格式化):

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

詳情:

  • 使用發現處理多個文件並獲得每個文件名的輸出,
    儘管seds缺乏支持
  • 基本上使用你R代碼裏面做經由SED切割和經由grep的計數
  • 給予文件名的sed作爲參數,通過代替管從貓
  • 使用sh-exec實現管路
    (由devnull到How to use pipe within -exec in find回答)

環境:

  • GNU sed的版本4.2.1
  • GNU bash中,版本3.1.23(1) -release(i686的-PC-MSYS)
  • GNU grep的2.5.4
  • 發現(GNU的findutils)4.4.2
0

使用jq在命令行上解析json。這是標準的工具。使用像sed這樣基於文本的工具來解析json是非常脆弱的,因爲它依賴於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' {} + 
1

解析.json數據與sedawk充滿了潛在的隱患。我建議使用格式感知工具如jq來查詢您想要的數據。在這種情況下,你可以這樣做

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

這將產生輸出類似

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

尼斯'jq'命令 – hek2mgl

+0

哦,等等,這是不正確的。再次檢查問題。我已經想知道 – hek2mgl

+0

我把你提供的樣本JSON作爲「一些更多的輸入文件」,使它有效的JSON(因爲你只提供了一個摘錄,它本身是無效的),並且上面的查詢做了一個per-在「漏洞」部分中記錄「嚴重性」值。您要求統計「嚴重性:4」的位置,但您的樣本數據不包含「嚴重性:4」的任何值。通過適當的採樣輸入數據和適當的輸出數據,可以調整'jq'命令來查詢那些嚴重性:4'匹配的情況。 – Gumnos