需要在 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]

NEED关键字可以在所有对我重要的行上找到。[] 之间的关键字对我来说很重要。我需要创建所有这些字符串的列表,而无需重复它们。

我已经在 Python 上完成了此操作,但看起来在我想运行脚本的机器上没有可用的 Python,所以我需要在 bash 中重新设计脚本。我只知道bash中的基本知识,我无法找到解决我的问题的方法。

我使用的 Python 脚本是:

import sys
import re

def testForKeyword(keyword, line):
    findStuff = re.compile(r"b%sb" % 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)

你能帮我解决这个问题吗?提前谢谢。

$ 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

简化你的蟒蛇代码:

#!/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

Bash 解决方案(没有唯一的库)

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

使用awk假设问题数据的infile的一种方法:

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

输出:

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

带有 grepcoreutils

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

输出:

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

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

如果您的日志位于名为"log.txt"的文件中,则可以获取它:

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

使用 sort -u,您将不会得到重复的行。

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

sed 解决方案可能是:

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

请注意,如果您在Windows上,则正确的方法是:

sed -e '/(needed)/!d' -e 's/(.*[)|(].$)//g' INPUTFILE
  1. 第一-e部分删除与(needed)不匹配的每一行
  2. 第二个删除所有内容,直到最后一个[和最后一个](在 Windows 上n之前r(回车),但这不是问题,因为输出正确打印......

相关内容

  • 没有找到相关文章

最新更新