我正在分析一些日志文件,而我正在尝试使用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结果中吗?
答案 0 :(得分:1)
从根文件夹中获取所有文件后,自然会在每次匹配前生成完整路径名。
cd ../..
grep -Fa "Print ended" */*/*.txt | ...
如果通配符太宽,那么简单的修复就是收紧它。您的示例将与folder_[12]/subfolder_[12]/*.txt
匹配,但我想实际上您的路径可能比这更复杂。 Bash允许大括号扩展,例如{this,other}/{one,two}/*.txt
,扩展为this/one/*.txt
,other/one/*.txt
,this/two/*.txt
,other/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 \;
显然,您可以将此输出输入到您可能需要的任何进一步处理中,以获得所需格式的结果,但这应该是微不足道的。