programing

루프 내의 각 출력 라인은 어떻게 처리합니까?

javajsp 2023. 4. 19. 22:16

루프 내의 각 출력 라인은 어떻게 처리합니까?

다음과 같이 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바쉬의 권고에 따라FAQ/001: 파일(데이터 스트림, 변수)을 라인별로(및 필드별로) 읽는 방법:

읽기 -r 옵션은 백슬래시 해석을 방지합니다(일반적으로 백슬래시 줄바꿈 쌍으로 사용되며, 여러 줄에 걸쳐 계속되거나 구분 기호를 이스케이프하기 위해 사용됩니다).이 옵션이 없으면 입력에서 이스케이프되지 않은 백슬래시는 모두 폐기됩니다.읽기에는 거의 항상 -r 옵션을 사용해야 합니다.

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

프로세스 대체에 대해서는 bash hackers 페이지에서 설명합니다.

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

원라이너를 찾고 있는 고객:

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

여기서 grep + 다른 것을 사용하는 대신 awk를 사용하는 것이 좋습니다.

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

--line-buffered grep 옵션을 사용하여 반복하지 않으면 다음과 같이 됩니다.

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

Symfony PHP Framework router debug 명령 출력을 사용하여 모든 "api" 관련 경로를 grep:

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

grep 결과에 대해 while/read 루프를 반복한다.예를 들어 다음과 같습니다.

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

대부분의 경우 처리 순서는 중요하지 않습니다.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

언급URL : https://stackoverflow.com/questions/16317961/how-to-process-each-output-line-in-a-loop