지정된 줄에 텍스트 패턴이 포함된(포함되지 않은) 파일 찾기

지정된 줄에 텍스트 패턴이 포함된(포함되지 않은) 파일 찾기

텍스트 파일 세트를 검색하고 다음 파일의 이름을 반환하려고 합니다.지정된 줄에텍스트 패턴을 포함하거나 지정된 텍스트를 포함하지 않습니다. 내 경우에는 마지막 줄에 텍스트 패턴이 포함되지 않은 파일의 파일 이름을 반환해야 합니다.

파일 1.txt

line1 abc
line2가 필요합니다

파일 2.txt


line1은 line2가 나를 반환하도록 해야 합니다 .

"must have"가 전달된 경우 함수/명령은 마지막 줄에 "must have"가 포함되어 있지 않기 때문에 file2.txt만 반환해야 합니다.

답변1

현재 디렉터리에 있는 모든 파일의 마지막 줄 내용을 검사하려면 다음을 사용 tail하세요 grep.

for file in *.txt
do
  tail -1 -- "$file" | grep -q "must have" || printf '%s\n' "$file"
done

이는 텍스트 파일의 이름이 .txt; 이후에 지정되었다고 가정합니다. 필요에 따라 와일드카드를 조정합니다. tail -1파일의 마지막 줄을 잡고 (뒤로 보는 것이 파일을 앞으로 읽는 것보다 더 효율적임) 해당 줄로 파이프하여 grep필요한 텍스트를 찾습니다. grep의 플래그는 -q작업에 대해 조용히 하고 이에 따라 반환 코드를 설정하도록 지시합니다. grep이 그렇다면아니요일치하는 항목이 발견되면 ||"or"는 쉘에 실행을 번갈아 지시하여 printf파일 이름을 인쇄합니다.

이 코드를 스크립트나 함수에 넣을 수 있습니다.

lastlinehas() {
  for file in *.txt
  do
    tail -1 -- "$file" | grep -q "$1" || printf '%s\n' "$file"
  done
}

답변2

GNU 사용 awk:

$ awk 'ENDFILE { if ($0 !~ /must have/) print FILENAME }' file2.txt file1.txt
file2.txt

이는 블록을 사용하여 ENDFILE정규식에 대해 현재 내용 $0(방금 끝에 도달한 파일의 마지막 줄) 을 테스트합니다 must have. 일치하는 항목이 없으면 파일 이름이 인쇄됩니다.

ENDFILE블록은 BSD awk또는 mawk.

사용 표준 awk:

for fname in *.txt; do
    awk 'END { if ($0 !~ /must have/) print FILENAME }' "$fname"
done

이는 awkGNU 솔루션과 유사하지만 awk각 파일에 대해 한 번 호출됩니다.

관련 정보