grep은 필요한 단어를 얻을 수 없지만 Linux는 다음 작업으로 넘어갑니다. 어떻게 막을 수 있나요?

grep은 필요한 단어를 얻을 수 없지만 Linux는 다음 작업으로 넘어갑니다. 어떻게 막을 수 있나요?

txt 파일이 많아요. 여기에는 "최소"(각 파일에 한 번만 나타남)라는 단어가 포함되어 있으며 해당 단어가 포함된 줄을 가져와 해당 줄을 새 파일에 표시하고 싶습니다.
이를 위해 다음 명령을 사용합니다.

grep 'Minimum' file1.txt > new1.txt     

나는 모든 파일(file1, file2 등)에 대해 이 작업을 수행했고 많은 것을 얻었습니다 newn.txt. 그러나 일부 파일에는 "최소"라는 단어가 없어서 newn.txt비어 있는 것으로 나타났습니다. 그렇다면 grep이 단어를 얻을 수 없다면 Linux는 왜 오류 메시지를 표시하지 않습니까? 계속해서 newn.txt를 생성하는 이유는 무엇입니까? 빈 파일을 제공받는 것은 정말 짜증나는 일입니다. 그러면 단어를 찾을 수 없으면
단어 생성을 방지할 수 있는 방법이 있나요?newn.txt

또한 이것을 bash 스크립트에 넣을 생각입니다. grep 명령이 첫 번째 단계이고 두 번째 단계에서는 newn.txt단어를 grep하므로 grep이 단어를 찾지 못하거나 빈 파일을 만듭니다. , 2단계를 수행하지 않고 스크립트를 중지하고 싶습니다. 이를 수행할 수 있는 방법이 있습니까?

답변1

쉘은 실행하기 전에도 출력 파일을 생성합니다 grep. grep콘텐츠를 추가해야 하는 경우 유틸리티는 해당 콘텐츠를 파일에 추가합니다. 아무 것도 발견되지 않으면 grep파일은 비어 있는 상태로 유지됩니다.

grep입력 파일에서 일치하는 항목을 찾지 못하면 "실패"를 나타내는 0이 아닌 종료 상태로 종료됩니다. 출력 파일은 삭제되지 않지만 파일 삭제에 실패하면 다음을 수행할 수 있습니다.

grep 'PATTERN' infile >outfile || rm -f outfile

grep일치할 수 없는 PATTERN경우 삭제 비어 있음 infile이 호출됩니다 . 엄밀히 말하면, 실패할 경우 파일 삭제를 시도합니다.rm -foutfilegrep어느이유(예: 입력을 읽을 수 없음) 또는 출력 파일을 생성할 수 없습니다.

일치하는 항목이 없을 경우에도 스크립트를 종료하려면 다음을 수행하세요.

if ! grep 'PATTERN' infile >outfile; then
    rm -f outfile
    exit
fi

답변2

이 루프를 시도해 보세요. 필요에 맞게 조정하세요.

i=0
for file in *; do
    line=""
    line="$(grep -hm1 'Minimum' "${file}")"
    [ -z "$line" ] || echo "$line" > new"${i}".txt
    ((i++))
done

*이 줄을 for file in *; do파일 세트로 변경하세요.

나타날 수 있는 원치 않는 grep 출력을 주의 깊게 제거하십시오.

답변3

for i in file*; do grep -q Minimum "$i" && grep Minimum "$i" > "${i/file/new}"; done
  • grep -q Minimum "$i"첫 번째 "최소값"이 발견된 직후에 존재합니다.
  • 두 번째는 grep실제 작업을 수행하며 첫 번째가 실패하면 실행되지 않습니다.
  • "${i/file/new}"file각 파일 이름을 다음으로 바꿉니다.new

답변4

Linux 명령이 실행될 때 스크립트가 계속 실행되는 것을 중지하는 가장 쉬운 방법실패하다추가하여

set -e

파일의 시작 부분에. 그러면 실패한 명령에 대해 스크립트가 중지됩니다. 일치하는 항목 이 없으면 grep실패 신호를 보냅니다. 예를 들어:

echo "starting"
echo "someword" > ex1.txt
cat ex1.txt | grep "otherword"
echo "continuing"

인쇄해 보세요

starting
continuing

하지만

set -e
echo "starting"
echo "someword" > ex1.txt
cat ex1.txt | grep "otherword"
echo "continuing"

인쇄해 보세요

starting

관련 정보