모든 하위 디렉터리에서 특정 파일 형식의 문자열이 마지막으로 나타나는 것을 찾습니다.

모든 하위 디렉터리에서 특정 파일 형식의 문자열이 마지막으로 나타나는 것을 찾습니다.

각각 깊이가 다른 여러 하위 디렉터리가 있습니다. 특정 파일 형식(예 *.out: . 어떻게 이를 달성할 수 있나요?

나는 시도했다:

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

하지만 이것은 마지막 파일의 마지막 문자열만 제공합니다.

답변1

하위 디렉터리의 상위 디렉터리에 있다고 가정합니다.

find . -type f -name '*.out' -exec sh -c '
  for f do
    grep "string" /dev/null "$f" | tail -n 1
  done
' sh {} +

답변2

나는 다음과 같은 것을 사용할 것입니다 :

for i in `find . -name "*.out" -type f`;
do
grep -l 'string' $i
grep 'string' $i|tail -1
done

첫 번째 grep을 사용하면 파일 이름과 아래 내용(두 번째 grep)을 얻을 수 있습니다.

\[*?파일 이름에 공백이나 .see 가 포함되지 않는 한cuonglm의 답변강력한 솔루션을 위해.

답변3

zshGNU 시스템 에서 :

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

답변4

도구를 사용하면 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이전 공간으로 복사하고 위도 $줄은 x패턴 공간으로 공간을 유지하도록 변경합니다. 일치하면 파일 이름과 줄을 p인쇄합니다 .) 출력은 다르지만 - 파일 이름과 해당 마지막 일치 줄은 다른 줄에 있습니다. 하지만 다른 파이프 로 파이프되는 경우F
sed

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

grep출력 1 을 시뮬레이션합니다 .
위의 가정세게 때리다(섹션 4 shopt -s globstar) 또는다루기 힘든. 숨겨진 파일을 포함하려면 shopt -s dotglob(세게 때리다) 또는 setopt dotglob(다루기 힘든).


1: 파일 이름에 개행 문자가 포함되어 있지 않은 경우.

관련 정보