我有多个日志文件,我需要计算其中包含“唯一 ID”的特定行的出现次数。
所以日志行看起来像
<Some_ID> is related to <Unique_ID>
并且上述值可以在日志中重复任意次,
我需要找到一个命令来计算多个文件中上述日志行(具有不同 ID)的唯一出现次数。
答案1
此命令将删除唯一 ID 之前的所有文本,然后统计唯一 ID 出现的次数并生成一个列表,按出现的升序排序:
cat log1 log2 ... logN | sed 's/^.* is related to //' | sort | uniq -c | sort -n
答案2
如果“Some_ID”和“Unique_ID”之间的文本确实是常量,那么以下内容应该有效(换句话说,例如,没有时间戳):
cat log1 log2 ... | grep "Some_ID" | sort | uniq -c | sort -n
答案3
如果我理解正确的话,你想获取 ID,我们可以使用 来完成此操作,并将它们插入到和 的sed
while 循环中。grep
wc
cat files | sed -e 's/.*is related to //g' \
| while IFS= read -r ID; do
count=`grep $ID files | wc -l`
echo "$ID = $count"
done
答案4
从您的问题和评论中的澄清来看,我理解您的问题的方式是您正在寻找独特关系的数量。因此,如果给定一个文件如下:
345 is related to 123
678 is related to 123
187 is related to 732
678 is related to 123
结果应该是 3。要执行此操作,sort
、uniq
、cat
、wc
和管道操作符将成为您的朋友。
如果您要搜索的所有文件都在一个文件夹中,您可以简单地使用*
(a通配符运算符)来搜索每个文件。例如,cat *
将打印当前目录中每个文件的内容。您还可以通过列出多个文件来指定它们。cat file1.txt file2.txt
将打印file1
和file2
。这可以与通配符结合使用来指定特定子目录中的文件:(cat dir1/* dir3/*
跳过dir2/
)。您还可以指定部分文件名:cat file*
将匹配file1
andfile123
但不匹配afile
。
使用上面的内容,您可以包括任何您想要输入的文件sort
。管道运算符 ( |
) 获取一个命令的输出并将其通过管道输送到另一命令的输入中。cat file1 | sort
将对 的内容进行排序file1
。然后,您可以将其通过管道传输uniq
以过滤掉所有重复的条目,然后使用wc
如下方式对行进行计数:cat file1 | sort | uniq | wc -l
。
使用我上面给出的示例文件,该sort
命令会将输出更改为:
187 is related to 732
345 is related to 123
678 is related to 123
678 is related to 123
uniq
将删除重复的条目(在此示例中位于底部):
187 is related to 732
345 is related to 123
678 is related to 123
并wc -l
计算行数并返回3
。
笔记:这个会算 123 is related to 321
和 321 is related to 123
作为二分开的关系。如果你想解决这个问题,你将需要做一些更复杂的事情,包括解析输入数据并将条目组织到表或哈希图中。
此外,在非常大的输入上,该命令链可能会挂起并且看起来好像已经冻结了。如果您使用大量输入数据,我会考虑设置一个数据库来管理数据,因为这将允许您使用查询更快地执行此类搜索。