我有一个包含大量文本的日志文件,其中一些是无用的。在这个日志中有一些对我很重要的行。这些行的模式是:
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)
你能帮我解决这个问题吗? 提前谢谢。
答案 0 :(得分: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
Bash解决方案(没有唯一的库)
#!/bin/bash
while IFS='][' read -a array
do
echo ${array[1]}
done < data.txt
答案 1 :(得分: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
答案 2 :(得分:3)
grep
和coreutils
:
grep NEEDED infile | grep -o '\[[^]]*\]' | tr -d '][' | sort | uniq
输出:
ld.so.1
libc.so.6
libgcc_s.so.1
libm.so.6
答案 3 :(得分:3)
awk -F '[' ' /NEEDED/ { print $NF } ' file_name | sed 's/]//' | sort | uniq
答案 4 :(得分:1)
awk '/NEEDED/ {gsub("[][]", ""); print $5}' < /tmp/1.txt | sort -u
答案 5 :(得分:1)
如果您的日志位于名为“log.txt”的文件中,您可以获取它:
grep "(NEEDED)" log.txt | awk -F"\[" '{print substr($2,0,length($2));}' - | sort -u
使用sort -u,你不会得到重复的行。
答案 6 :(得分:1)
sed解决方案可能是:
sed -e '/(needed)/!d' -e 's/\(.*\[\)\|\(\]$\)//g' INPUTFILE
注意,如果你在Windows上,那么正确的方法是:
sed -e '/(needed)/!d' -e 's/\(.*\[\)\|\(\].$\)//g' INPUTFILE
-e
部分会删除与(needed)
[
和最后]
(以及\r
(回车)在\n
之前的窗口,但这不是问题,因为输出打印得恰到好处......