2017-04-19 7 views
0

ログファイルを分析していますが、私はbashでデータを準備しようとしています。マイフォルダ構造は次のようになります。fgrep結果にフォルダ名を追加する

<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 

私は私が必要とするテキスト行を取るコマンドを持っているが、結果の先頭に一部テキストが追加されますが、私は知りません結果の行にフォルダ名を追加する方法。

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}'` 

ので、それが結果をFGREPする<folder_n><subfolder_n>を追加するコマンドを編集しますか?

答えて

1

ルートフォルダからすべてのファイルをグレープすると、当然、各マッチの前に完全なパス名が生成されます。

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

ワイルドカードが広すぎる場合、簡単な修正はそれを強化することです。あなたの例はfolder_[12]/subfolder_[12]/*.txtと一致しますが、現実にはパスはおそらくそれよりも少し複雑かもしれません。 Bashは、this/one/*.txt,other/one/*.txt,this/two/*.txt,other/two/*.txtに展開する{this,other}/{one,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

'grep -F'は' fgrep'に相当する現代風ですが、どちらも動作するはずです。 – tripleee

+0

ありがとうございます。 コマンド 'fgrep 'の編集方法を教えてください。" * .txt -a'で説明したフォルダ名をインクルードしましたか?どの地点からコマンドを実行すべきですか? –

+0

これは文字通り、この答えの最初の文とそれに続く例です。複数のファイルで 'grep'を実行すると、一致したファイルの名前が渡された形式で各一致の前に表示されます。そのため、フォルダ構造を持つファイル名の束を渡すと、それが印刷されます。 (複数のファイル名を強制するために '/ dev/null'を追加することもありますが、' grep -H'を指定すると強制的にファイル名が出力されます)。 – tripleee

0

findを使用して再帰を実行すると、各一致のパスを取得できます。

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

明らかにすることができますパイプあなたが必要な形式で結果を取得する必要があるかもしれませんが、これは行うことは些細なことする必要があり、更なる処理に本の出力。

+0

結果は次のとおりです: "-exec'の引数がありません。私はこれがこれを知っている人にとっては些細なものだと理解していますが、これは私にとっては些細なことではありません。 –

+1

最後に '\;'を忘れてしまったようです。 – tripleee

関連する問題