답변:
쉬운 방법 중 하나는 출력을 변수에 저장하지 않고 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 p || [[ -n $p ]]; do ...
(에서 차용 stackoverflow.com/questions/1521462/... )
소위 프로세스 대체를 사용하여 명령 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 해커 페이지에 설명되어 있습니다 .
프로세스 대체는 프로세스의 입력 또는 출력 (일부 명령 시퀀스)이 임시 파일로 나타나는 리디렉션의 한 형태입니다.
for
버전을 쳤다 . stackoverflow.com/a/14588210/1983854 에서 "${$(grep xyz abc.txt)[@]}"
와 같이 루프를 시도 했지만 실패했습니다 . 그래서 나는 첫 번째 버전을 떠납니다.
zsh
이러한 종류의 중첩이 작동하는을 사용하지 않는 한 ).
while IFS= read -r result <&3
하고done 3< <(grep ...
grep + 대신에 awk를 사용하는 것이 좋습니다.
awk '$0~/xyz/{ //your code goes here}' abc.txt
//your code goes here
어떻게 참조 하시겠습니까?
grep -o
이런 종류의 힘을 언급하지 않습니다.-o
플래그는 다시 줄 것이다 에만 출력을 한 줄에 하나의 일치와 일치하는 텍스트를. (완전하지는 않으므로echo aaa |grep 'a*'
"aaa"만 제공하고 "", "a"및 "aa"의 세 부분 일치 항목은 생략합니다.