web-dev-qa-db-ja.com

すべてのサブディレクトリで、特定のファイルタイプで最後に出現する文字列を検索します

それぞれ深さが異なる複数のサブディレクトリがあります。特定のファイルタイプで最後に出現する文字列を検索する必要があります(たとえば、*.out)。どうすればこれを達成できますか?

私が試してみました:

grep -r 'string' **/*.out | tail -1

しかし、それは私に最後のファイルの最後の文字列だけを与えます。

3
WanderingMind

gnuツールを使用すると、gawkの単一の呼び出しを使用できます。

awk '/pattern/{l=$0} ENDFILE{if (l) {print FILENAME ":" l; l=""}}' **/*.out

(行が一致する場合は、それをlに格納します。各ファイルの最後で、lが空でない場合は、ファイル名とlを出力し、lをリ​​セットします)

またはsed

sed -ns '/pattern/h;${x;//{F;p}}' **/*.out

(行が一致する場合は、holdスペースにコピーします。la$t行の場合、exchange holdspacew。patternspace;一致する場合、print File name and line)
出力は異なりますが(ファイル名と対応する最後に一致する行は別々の行にあります)、別のsedにパイプされている場合(例:.

sed -ns '/pattern/h;${x;//{F;p}}' **/*.out |sed '$!N;s/\n/:/'

grepの出力を模倣します1
上記はbash(v。4with shopt -s globstar)またはzshを想定しています。隠しファイルを含めるには、shopt -s dotglobbash)またはsetopt dotglobzsh)を追加します。


1:これらのファイル名のいずれにも改行文字が含まれていない限り。

1
don_crissti

GNUシステムでzshを使用:

for f (**/*.out(.)) tac < $f | grep --label=$f -m1 string
1