텍스트 파일 세트를 검색하고 다음 파일의 이름을 반환하려고 합니다.지정된 줄에텍스트 패턴을 포함하거나 지정된 텍스트를 포함하지 않습니다. 내 경우에는 마지막 줄에 텍스트 패턴이 포함되지 않은 파일의 파일 이름을 반환해야 합니다.
파일 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
이는 awk
GNU 솔루션과 유사하지만 awk
각 파일에 대해 한 번 호출됩니다.