一步/命令查找,解压缩和grep多个文件的内容

时间:2019-06-24 15:04:02

标签: shell logging command-line zip

首先,我在这里提出了一个问题:Unzip a file and then display it in the console in one step 它有效,对我有很大帮助。 (请阅读)

现在我有第二个问题。我没有一个zipped log file,但是我在不同的文件夹中有很多文件夹,我需要先找到它们。这些文件具有相同的名称。例如:

/somedir/server1/log.gz
/somedir/server2/log.gz
/somedir/server3/log.gz

以此类推...

我需要的是一种方法:

  1. 找到所有文件,例如:find /somedir/server* -type f -name log.gz
  2. 将文件解压缩为gunzip -c log.gz
  3. 在文件内容上使用grep

重要!整个过程应该一步一步完成。 我不能首先将提取的文件存储在文件系统中,因为它是只读文件系统。我需要通过管道将一个命令的输出连接到下一个命令的输入。

之前,日志文件为文本格式(.txt),因此我不必首先将其解压缩。在这种情况下很容易: 例如 find /somedir/server* -type f -name log.txt | xargs grep "term"

现在,我必须处理压缩文件。这意味着,找到文件后,我首先需要以某种方式解压缩它们,然后将内容发送到grep。 用一个文件,我做: gunzip -p /somedir/server1/log.gz | grep term 但是对于多个文件,我不知道该怎么做。例如,如何将find的输出传递给gunzip并将grep传递给#!/bin/bash source /etc/hadoop/conf/hadoop-env.sh date=`date +%x` space=`/*/*/space.sh | awk -F ' ' '{print $7}' | tr '\n' ' ' | sed -r 's/CONTENT_SIZE//g'` total_space=`hdfs --config /*/*/*/hadoop dfs -count -q -v /*/*/*/*/ | awk -F ' ' '{if(NR>1)print $3}'` echo ${date} ' ' ${space} ${total_space} >> /*/*/*_space_report.csv ?!

如果还有另一种方式/“最佳实践”怎么做,也很受欢迎:)

1 个答案:

答案 0 :(得分:1)

find可让您在找到的文件上调用命令:

find /somedir/server* -type f -name log.gz -exec gunzip -c '{}' + | grep ...

来自man page

  

-exec command {} +

     

-exec操作的此变体在以下位置运行指定的命令   选定的文件,但命令行是通过附加来构建的   每个选择的文件名末尾;总数   该命令的调用将远远少于数量   匹配的文件。命令行的构建方式几乎相同   xargs构建其命令行的方式。仅一个实例   命令中允许使用{},并且(当查找到   从外壳调用),应将其引号(例如'{}')   保护它免受炮弹的解释。该命令是   在起始目录中执行。如果有任何调用   +表单返回一个非零值作为退出状态,然后   find返回非零退出状态。如果发现遇到   错误,有时可能会导致立即退出,因此有些   挂起的命令可能根本不会运行。 -exec的此变体   始终返回true。