首先,我在这里提出了一个问题: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
以此类推...
我需要的是一种方法:
find /somedir/server* -type f -name log.gz
gunzip -c log.gz
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
?!
如果还有另一种方式/“最佳实践”怎么做,也很受欢迎:)
答案 0 :(得分:1)
find
可让您在找到的文件上调用命令:
find /somedir/server* -type f -name log.gz -exec gunzip -c '{}' + | grep ...
来自man page:
-exec command {} +
-exec操作的此变体在以下位置运行指定的命令 选定的文件,但命令行是通过附加来构建的 每个选择的文件名末尾;总数 该命令的调用将远远少于数量 匹配的文件。命令行的构建方式几乎相同 xargs构建其命令行的方式。仅一个实例 命令中允许使用
{}
,并且(当查找到 从外壳调用),应将其引号(例如'{}'
) 保护它免受炮弹的解释。该命令是 在起始目录中执行。如果有任何调用+
表单返回一个非零值作为退出状态,然后 find返回非零退出状态。如果发现遇到 错误,有时可能会导致立即退出,因此有些 挂起的命令可能根本不会运行。 -exec的此变体 始终返回true。