【发布时间】:2012-09-26 14:07:42
【问题描述】:
我有一个包含大量文本的日志文件,其中一些是无用的。在这个日志中有一些对我很重要的行。这些线的模式是:
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]
NEEDED 关键字可以在对我来说很重要的所有行中找到。 [] 之间的关键字对我来说很重要。我需要创建所有这些字符串的列表,而不是重复它们。
我已经在 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)
你能帮我解决这个问题吗? 提前致谢。
【问题讨论】:
-
一种解决方案是使用
grep拉出所有包含“NEEDED”的行,然后使用cut在方括号上拆分行,然后使用uniq删除所有重复项。跨度> -
你想要什么? .so 的列表?
-
你在 Python 中的“算法”是什么样的?你需要展示一些工作让我们帮忙。想想你的 python 代码中发生了哪些步骤。然后像“这是我在 python 中执行的步骤,1. .... 2 .... 3....,shell 中的等效或最佳实践技术是什么?”这样的问题。将表明您不只是在寻找一些免费的咨询。 (编辑您的问题,不要在 cmets 中回复;-)。祝你好运。
-
哪个版本的 Bash? bash 3 及更高版本支持类似于 Python(扩展 RE)的 RE 以及捕获。您也许可以重用您的 Python RE(假设您使用过它)
-
是的,没错,我需要创建一个唯一的 .so 列表。