bash 쉘 루프의 grep 명령

bash 쉘 루프의 grep 명령

out.log라는 로그 파일이 있습니다. 이 로그 파일에서 문자열 목록(filelist.txt)을 검색해야 합니다.

filelist.txt의 각 파일에 대해 "out.log"에 일치하는 각 줄이 필요합니다. 여러 번 나타날 수 있습니다.

cat out.log | grep -i I466030.CXR910E >> search_result.txt

이렇게 하면 I466030.CXR910E를 검색하여 search_result.txt로 출력합니다.

for i in `cat filelist.txt`; do  grep -i "$i" out.log >> result.txt; done


 for i in `cat filelist.txt`; 
   do  
     echo $i
     cat out.log | grep -i $i >> result2.txt
     grep $i out.log >> result3.txt 
  done 

위 코드 echo는 검색 문자열을 출력하지만 grep은 결과 *.txt에 출력을 쓰지 않습니다.

내가 여기서 무엇을 놓치고 있는 걸까요? 조언해 주셔서 감사합니다.


의견에 대한 응답:

xxxxxm@cxxxrtrls01[DEV][rerun] $ grep -i -f filelist.txt out.log > result.txt
xxxxxm@cxxxrtrls01[DEV][rerun] $ ll
total 564
-rw-r----- 1 cnrlsadm cnrlsadm   4600 Aug 19 09:36 filelist.txt
-rw-r----- 1 cnrlsadm cnrlsadm    216 Aug 19 10:14 file.sh
-rw-r--r-- 1 cnrlsadm cnrlsadm 557403 Aug 19 10:10 out.log
-rw-r--r-- 1 cnrlsadm cnrlsadm      0 Aug 19 12:14 result.txt
-rw-r----- 1 cnrlsadm cnrlsadm    213 Aug 19 12:10 srch.sh
xxxxxm@cxxxrtrls01[DEV][rerun] $

result.txt의 크기는 0이고 내용이 없습니다.

답변1

  1. 파일에서 줄을 읽지 마세요for

  2. grep의 -f옵션을 사용하여 제공패턴이 포함된 파일따라서 전혀 반복할 필요가 없습니다.

    grep -i -f filelist.txt out.log > result.txt
    

    이제 한 줄에 한 번이 아닌 grep을 한 번만 호출하면 됩니다. out.log가 크면 CPU가 감사할 것입니다.

답변2

글쎄요..여기 응답의 대부분은 맞습니다. 제 실수는 "filelist.txt"가 Excel과 Windows에서 생성되었다는 것입니다. 일단 파일을 유닉스 형식으로 변환합니다. 모두 제일 좋다.

나는 매우 시간이 많이 걸리는 교훈을 배웠습니다. 질문에 답변해주신 모든 분들께 감사드립니다 :)

좋은 하루 되세요!

답변3

아래 스크립트를 사용해보십시오. 훌륭하게 작동합니다.

for i in `cat filelist.txt`
do
for j in `cat out.log`
do
grep -i "$j" $i
done
done

filelist.txt.====> Consists of filenames

관련 정보