それぞれ深さが異なる複数のサブディレクトリがあります。特定のファイルタイプで最後に出現する文字列を検索する必要があります(たとえば、*.out
)。どうすればこれを達成できますか?
私が試してみました:
grep -r 'string' **/*.out | tail -1
しかし、それは私に最後のファイルの最後の文字列だけを与えます。
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
(行が一致する場合は、h
oldスペースにコピーします。la$
t行の場合、ex
change holdspacew。patternspace;一致する場合、p
rint F
ile 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 dotglob
(bash)またはsetopt dotglob
(zsh)を追加します。
1:これらのファイル名のいずれにも改行文字が含まれていない限り。
GNUシステムでzsh
を使用:
for f (**/*.out(.)) tac < $f | grep --label=$f -m1 string