2012-09-26 81 views
4

我有一個包含大量文本的日誌文件,其中有些文件是無用的。在這個日誌中有一些對我很重要的行。這些行的模式是:需要解析bash中的日誌文件

0x00000001 (NEEDED)      Shared library: [libm.so.6] 
0x00000001 (NEEDED)      Shared library: [libc.so.6] 
0x00000001 (NEEDED)      Shared library: [ld.so.1] 
0x00000001 (NEEDED)      Shared library: [libgcc_s.so.1] 

需要的關鍵字可以在對我很重要的所有行上找到。 []之間的關鍵字對我來說很重要。我需要創建所有這些字符串的列表,而不必重複它們。

我已經在Python上做了這個,但看起來像在機器上我想運行腳本沒有Python可用,所以我需要在bash中重寫腳本。我只知道bash中的基本內容,而且我無法爲我的問題找到解決方案。

我使用的Python腳本是:

import sys 
import re 


def testForKeyword(keyword, line): 
    findStuff = re.compile(r"\b%s\b" % keyword, \ 
            flags=re.IGNORECASE) 

    if findStuff.search(line): 
     return True 
    else: 
     return False 

# Get filename argument 
if len(sys.argv) != 2: 
    print("USAGE: python libraryParser.py <log_file.log>") 
    sys.exit(-1) 

file = open(sys.argv[1], "r") 

sharedLibraries = [] 
for line in file: 
    if testForKeyword("NEEDED", line): 
     libraryNameStart = line.find("[") + 1 
     libraryNameFinish = line.find("]") 

     libraryName = line[libraryNameStart:libraryNameFinish] 

     # No duplicates, only add if it does not exist 
     try: 
      sharedLibraries.index(libraryName) 
     except ValueError: 
      sharedLibraries.append(libraryName) 

for library in sharedLibraries: 
    print(library) 

能否請你幫我解決這個問題? 在此先感謝。

+0

一個解決辦法是拉出包含所有行 「需要」 的使用'grep',然後使用'cut'將方括號中的行拆分,然後使用'uniq'來刪除所有重複項。 –

+0

你想要什麼? .so的列表? – Marcus

+0

你在Python中的「算法」是什麼樣的?您需要展示一些幫助我們的工作。考慮一下你的python代碼中發生了哪些步驟。然後像「這裏是我在python中執行的步驟」這樣的問題,1. .... 2 .... 3 .... shell中的等效或最佳實踐技巧是什麼?會表明你不只是尋找一些免費諮詢。 (編輯你的問題,不要在評論中回覆; - )。祝你好運。 – shellter

回答

3

一種使用方式awk假設infile有問題的數據:

awk ' 
    $2 ~ /NEEDED/ { 
     lib = substr($NF, 2, length($NF) - 2); 
     libs[ lib ] = 1; 
    } 
    END { 
     for (lib in libs) { 
      printf "%s\n", lib; 
     } 
    } 
' infile 

輸出:

libc.so.6                                                          
libgcc_s.so.1                                                         
ld.so.1                                                       
libm.so.6 
+0

我想這就是我要找的。非常感謝! – user1677894

1
awk '/NEEDED/ {gsub("[][]", ""); print $5}' < /tmp/1.txt | sort -u 
+1

我不知道一個'uniq'命令也需要''sort';-)。祝大家好運 – shellter

+0

你可以用'sort -u'替換'uniq' – arutaku

+0

廢話,我一直忘記uniq沒用!謝謝。 –

1

如果你有你的日誌在一個名爲 「log.txt的」 文件,你可以得到它:

grep "(NEEDED)" log.txt | awk -F"\[" '{print substr($2,0,length($2));}' - | sort -u 

使用sort -u你不會得到重複的行。

+1

[UUoCA](http://partmaps.org/era/unix/award.html) –

+1

在同一命令行中使用grep和awk是褻瀆! –

+0

(編輯)我很抱歉U_U'。你是對的。 – arutaku

6
$ awk -F'[][]' '/NEEDED/ {print $2}' data.txt | sort | uniq 
ld.so.1 
libc.so.6 
libgcc_s.so.1 
libm.so.6 

AWK只:中

$ awk -F'[][]' '/NEEDED/ {save[$5]++}END{ for (i in save) print i}' data.txt 
libc.so.6 
libm.so.6 
libgcc_s.so.1 
ld.so.1 

簡化您的Python代碼:

#!/usr/bin/env python 

libs = [] 

with open("data.txt") as fd: 
    for line in fd: 
     if "NEEDED" in line: 
      libs.append(line.split()[4]) 

for i in set(libs): 
    print i 

猛砸溶液(不唯一LIBS)

#!/bin/bash 

while IFS='][' read -a array 
do 
    echo ${array[1]} 
done < data.txt 
1

SED解決方案可能是:

sed -e '/(needed)/!d' -e 's/\(.*\[\)\|\(\]$\)//g' INPUTFILE 

,如果你是在Windows上,去正確的方法是這樣的:

sed -e '/(needed)/!d' -e 's/\(.*\[\)\|\(\].$\)//g' INPUTFILE 
  1. 第一-e部分刪除每一行不匹配(needed)
  2. 第二刪除一切直到最後的[和最後的](並在窗口\r(回車)之前\n但th因爲輸出正確打印,所以不是問題。
+0

'sed:-e表達式#1,字符2:未知命令:'/'' –

+0

更正瞭解決方案。 –

3

隨着grepcoreutils

grep NEEDED infile | grep -o '\[[^]]*\]' | tr -d '][' | sort | uniq 

輸出:

ld.so.1 
libc.so.6 
libgcc_s.so.1 
libm.so.6 
3

awk -F '[' ' /NEEDED/ { print $NF } ' file_name | sed 's/]//' | sort | uniq