2013-11-22 4 views
1

파일 info.txt가 있다고 가정합니다. 첫 번째 열은 id이고, 나머지는 그 내용입니다.쉘에서 grep에 의해 반환 된 행을 반복합니다.

1 aaa bbb 
1 ccc ddd mmm 
4 ccc eee 
7 ddd fff jjj kkk 

나는 "1"로 시작하는 줄만 사용합니다. 그래서 나는 그것을 필터링 GREP을 사용

what_I_concern=$(cat info.txt | grep -iw 1 | cut -d ' ' -f 2-) 

을 한 후 나는이 라인을 통해 반복 할 :

for i in $what_I_concern; do 
    pass $i to another program #I want to pass one line at a time 
done 

하지만 정말 한 것은이 라인의 모든 단어를 반복하는 대신 복용 각 줄은 전체적으로.

이 문제를 어떻게 해결할 수 있습니까?

+0

(IFS 기본 가정) 모두이 경우에 grepcut을 사용하지 않도록 할 수 있지만, * 모든 두번째 *, 맞지? 다른 식으로 표현하면 입력의 형식은 무엇입니까? – Rajish

답변

2

필요한 것을 성취하려는 방법은 단어 분리를 유발하는 것입니다. 대신, 말 :

while read -r line; do 
    someprogram $(cut -d' ' -f2- <<< "$line") 
done < <(grep '^1' info.txt) 

<() 구문 Process Substitution로 알려져 있습니다. 이 경우 while 루프가 grep 명령의 출력을 파일로 읽을 수 있습니다.

+0

grep 전에 '<'를 설명해 주시겠습니까? – duleshi

1

당신은 * 모든 * 단어를 반복 할 수 있도록 당신의 * 후 * 숫자에 대해 조심

while read -r first rest; do 
    [ "$first" = "1" ] && pass "$rest" to another program; 
done < info.txt 
관련 문제