将文件夹名称添加到fgrep结果中

时间:2017-04-19 07:59:45

标签: bash perl command-line

我正在分析一些日志文件,而我正在尝试使用bash准备数据。我的文件夹结构如下所示:

<main_folder>
    <folder_1>
        <subfolder_1>
            <log_1>
            <log_2>
        <subfolder_2>
            <log_1>
    <folder_2>
        <subfolder1>
            <log_1>

我想通过每个<folder_n>并使用fgrep获取一些行。我想将<folder_n><subfolder_n>名称(没有完整路径)添加到每行的开头,用空格行分隔。

所以结果看起来像这样:

folder_1 subfolder_1 text_1 text_2 text_3
folder_1 subfolder_2 text_1 text_2 text_3
folder_1 subfolder_2 text_1 text_2 text_3
folder_2 subfolder_1 text_1 text_2 text_3

我有一个命令,它将我需要的文本行添加一些文本到结果的开头,但我不知道如何将文件夹名称添加到结果行。< / p>

fgrep "Print ended" *.txt -a | awk '{ print $1 " " $2 " " $4}' | perl -ne 'print " TEST $_"'

我的问题是:如果我位于~/main_folder,如何编辑命令

fgrep "Print ended" *.txt -a | awk '{ print $1 " " $2 " " $4}'`

这样它会将<folder_n><subfolder_n>添加到fgrep结果中吗?

2 个答案:

答案 0 :(得分:1)

从根文件夹中获取所有文件后,自然会在每次匹配前生成完整路径名。

cd ../..
grep -Fa "Print ended" */*/*.txt | ...

如果通配符太宽,那么简单的修复就是收紧它。您的示例将与folder_[12]/subfolder_[12]/*.txt匹配,但我想实际上您的路径可能比这更复杂。 Bash允许大括号扩展,例如{this,other}/{one,two}/*.txt,扩展为this/one/*.txtother/one/*.txtthis/two/*.txtother/two/*.txt

目前还不清楚您的grep | awk | cut | perl管道究竟是做什么的,但我想它需要进行一些调整。通常,看起来像grep | awk的任何内容都应该在Awk或Perl中重新实现。

perl -lnae 'print(join(" ", "TEST", split("/", $ARGV), $F[0], $F[2]))
     if /Print ended/' */*/*.txt

在斜杠上用$ARGV拆分相对文件名并加入空格似乎是有原因的,但会产生你要问的结果。

答案 1 :(得分:0)

如果使用find进行递归,则可以获得每个匹配的路径,例如

find . -name \*.txt -exec grep "Print ended" {} /dev/null \;

显然,您可以将此输出输入到您可能需要的任何进一步处理中,以获得所需格式的结果,但这应该是微不足道的。