다음과 같이 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 -r
BashFAQ / 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