根据其他文件中的输入搜索文件的命令

时间:2017-06-09 01:23:07

标签: perl shell grep command

我在Linux平台上,我需要帮助完成我的任务或任何有关如何完成此任务的建议。

我有2个文本文件,第一个文件有一个ID列表(日志ID),第二个文件是一个日志文件,其中包含带有日志ID的各种活动的条目。

基本上,我想从第一个文件中选择一个日志ID,并搜索第二个文件中是否存在此日志ID。

第一个文件有15000个日志ID,并且手动无法检查每个文件。

这是我的编码尝试:
grep -q "LogID: 1005534" logfile.txt && echo "yes" || echo "no"

但是如何使用我拥有的所有log-id来迭代命令?

这是logID和实际日志文件

enter image description here enter image description here

2 个答案:

答案 0 :(得分:1)

我认为你自己的尝试,使用grep,非常接近 基于本答案末尾引用的两个文件作为演示
(一个MCVE你会很好......),我建议制作三个列表,使用:

  • positive:grep -of Ids.txt Logfile.txt | sort -u
  • 否定a:grep -vf Ids.txt Logfile.txt | grep -o "LogID: .*" | sort -u
  • 否定b:grep -o "LogID: .*" Logfile.txt >InIDs.txt && grep -vf InIDs.txt IDs.txt | sort -u

注意:

  • 如果您的系统有两个“排序”程序,例如Windows和GNU,请确保使用GNU版本,即通过提供二进制文件的完整路径; Windows排序不知道-u选项。
  • 这些文件有 UNIX行结尾(只有LF,而不是CRLF),这很重要。
  • 假设:字符串“LogID:dddddd”仅出现在行的末尾
    (这个假设可以略微放宽,可能会删除,使用更复杂的正则表达式)

环境IDs.txt
(注意Logfile.txt中包含的1005539,1005540 ):

LogID: 1005534
LogID: 1005535
LogID: 1005536
LogID: 1005537
LogID: 1005538
LogID: 1005539
LogID: 1005540

环境Logfile.txt
(请注意IDs.txt中包含的1005548 以及ID相同的行):

blabla LogID: 1005534
bloblo LogID: 1005536
blaablaa LogID: 1005534
blublu LogID: 1005537
blibli LogID: 1005548
bluubluu LogID: 1005537
bleble LogID: 1005538

输出,积极:

LogID: 1005534
LogID: 1005536
LogID: 1005537
LogID: 1005538

输出,否定a
(在Logfile.txt中但不在IDs.txt中的那些):

LogID: 1005548

输出,负b b (那些在IDs.txt但不在Logfile.txt中的那些):

LogID: 1005535
LogID: 1005539
LogID: 1005540

答案 1 :(得分:1)

1:获取唯一ID fr file1。对于每个ID,请在file2中搜索

sort -u file1 | while read ID; do
  grep -q $ID file2 && echo $ID: YES || echo $ID: no # costly operation & repetitive
done

2:如果你有很多条目(特别是在file2上)。唯一地,从两个文件中获取所有ID并比较注释

sort -u file1 > /tmp/f1
grep -i target.*logID file2 |sed 's/.*target://' |sort -u > /tmp/f2 # one-pass
diff -y /tmp/f1 /tmp/f2 | grep -q ">" # YES list
diff -y /tmp/f1 /tmp/f2 | grep ">" # no list