[bash] grep 명령의 결과로 수신 된 각 줄을 처리하는 방법

다음과 같이 grep 명령을 실행 한 후 파일에서 여러 줄을 검색했습니다 .

var=`grep xyz abc.txt`

결과적으로 xyz로 구성된 10 줄이 있다고 가정 해 봅시다.

이제 grep 명령의 결과로 얻은 각 줄을 처리해야합니다. 이를 위해 어떻게 진행합니까?



답변

쉬운 방법 중 하나는 출력을 변수에 저장하지 않고 while / read 루프를 사용하여 직접 반복하는 것입니다.

다음과 같은 것 :

grep xyz abc.txt | while read -r line ; do
    echo "Processing $line"
    # your code goes here
done

정확히 당신이 무엇을 추구하는지에 따라이 체계에는 변형이 있습니다.

루프 내부의 변수를 변경해야하고 외부에서 변경 사항을 볼 수 있어야하는 경우 fedorqui의 답변에 설명 된대로 프로세스 대체를 사용할 수 있습니다 .

while read -r line ; do
    echo "Processing $line"
    # your code goes here
done < <(grep xyz abc.txt)


답변

소위 프로세스 대체를 사용하여 명령 while read결과에 의해 제공되는 다음 루프를 수행 할 수 있습니다 grep.

while IFS= read -r result
do
    #whatever with value $result
done < <(grep "xyz" abc.txt)

이런 식으로 결과를 변수에 저장할 필요는 없지만 출력을 루프에 직접 “주입”할 수 있습니다.


의 사용을 참고 IFS=하고 read -rBashFAQ / 001의 권장 사항에 따라 : I 파일 (데이터 스트림, 변수) 라인 별 (및 / 또는 필드 단위)를 읽을 수 있습니까? :

-r 옵션을 읽으면 백 슬래시 해석을 방지 할 수 있습니다 (보통 백 슬래시 줄 바꿈 쌍으로 사용, 여러 줄을 넘거나 구분자를 이스케이프하기 위해 사용) 이 옵션이 없으면 입력에서 이스케이프 처리되지 않은 백 슬래시가 삭제됩니다. 거의 항상 -r 옵션을 read와 함께 사용해야합니다.

위의 시나리오에서 IFS =는 선행 및 후행 공백의 트리밍을 방지합니다. 이 효과를 원하면 제거하십시오.

프로세스 대체와 관련하여 bash 해커 페이지에 설명되어 있습니다 .

프로세스 대체는 프로세스의 입력 또는 출력 (일부 명령 시퀀스)이 임시 파일로 나타나는 리디렉션의 한 형태입니다.


답변

grep + 대신에 awk를 사용하는 것이 좋습니다.

awk '$0~/xyz/{ //your code goes here}' abc.txt


답변

–line-buffered grep 옵션을 사용하여 반복하지 않으면 :

your_command | grep --line-buffered "your search"

모든 “api”관련 라우트를 grep하기 위해 Symfony PHP Framework 라우터 디버그 명령 출력을 사용하는 실제 예 :

php bin/console d:r | grep --line-buffered "api"


답변

종종 처리 순서는 중요하지 않습니다. 이 상황에서 GNU Parallel이 만들어졌습니다.

grep xyz abc.txt | parallel echo do stuff to {}

처리하는 것이 더 비슷하다면 :

grep xyz abc.txt | myprogram_reading_from_stdin

그리고 myprogram다음 실행할 수 있습니다 느리다 :

grep xyz abc.txt | parallel --pipe myprogram_reading_from_stdin


답변

while / read 루프를 사용하여 grep 결과를 반복하십시오. 처럼:

grep pattern filename.txt | while read -r line ; do
    echo "Matched Line:  $line"
    # your code goes here
done


답변

하나의 라이너를 찾는 사람들을 위해 :

grep xyz abc.txt | while read -r line; do echo "Processing $line"; done