linux/shell

[리눅스] 원하는 문자가 들어있는 라인만 카운트하기

alignG 2010. 8. 24. 15:37
오늘은 간단하게 라인카운트 하는 것을 올려 보겟습니다. 파이프와 몇가지 명령어나 알면 누구나 간단하게 할수 있습니다.
라인카운트 별로 사용하지 않을 것 같지만 응근 사용할 곳이 많은 녀석입니다. passwd파일을 통해 현재 몇명의 유저가 등록되있는지라던지. 저처럼 특정문서에서 특정 단어가 몇개 들어가있는지 알아 볼때 말이죠.

오늘은 grep이란 명령어와 wc라는 명령어를 사용할 것입니다.
grep은 특정 파일에서 원하는 부분만 가져올때 사용을 합니다.
ex) $ grep 안녕 a.txt #a.txt에서 안녕이라고 한 라인만 출력한다.
그리고 wc는 word count 즉 문자를 카운팅합니다. 라인단위 단어단위 문자단위등으로 말이지요 
ex) $ wc -l a.txt #a.txt의 라인수를 카운팅한다.

이 2가지를 묶는다면 어떨까요? grep으로 내가 원하는 파일을 찾고 그 결과 값을 wc로 넘겨서 라인수를 카운팅하고...
이럴 때 사용하는 것이 바로 |(PIPE)입니다. 파이프라는 멀처럼 하나의 결과치를 다른곳으로 이동시켜 주지요
그래서 아래와 같이 입력을 하면 두 가지 명령어를 합성해서 사용할 수 있습니다. 
$ grep 안녕 a.txt | wc -l


저는 제가 텍스트 파일로 써두었던 질문.txt파일에서 #로된 질문이 아닌 주석들만 제거하고 카운팅을 해보도록 하겟습니다.

질문.txt의 내용
##GROW
#Goal(목표)
올해 동안 당신이 이루고 싶은 목표는 무엇입니까?
그 목표는 장기 목표입니까 단기 목표입니까?
그 목표를 이루었다면 1년 후에 당신은 어떻게 변해 있을까요? 구체적으로 묘사해 주시겠습니까?
이 목표를 이루는데 장애물이 있다면 무엇입니까?
#Option(대안)
이 목표를 이루기 위한 해결 방법들은 무엇이 있을까요?
해결 방법이 또 있다면?
.... 브레인 스토밍 ..
#Will(의지)
이 방법들 가우데 한 해 중점적으로 노력할 수 있는 것을 3가지만 찾아본다면?
3 가지 가운데 단 한 가지 방법에 집중하신다면 무엇을 선택하시겠습니까?
3가지중 그 것을 선택하신 이유는 무엇입니까?
한 주간 언제 그 일을 실행 하시겠습니까?
이 일을 위하여 지불할 대가가 있다면?
이 일을 하는데 도움을 줄 사람은 누가 있습니까?
이 목표 달성을 위해서 하지 말아야 할 것이 있다면?
목표를 성취한 당신을 어떻게 축하해 주시겠습니까?
.
.

명령어
$ grep ^[^#] 질문.txt | wc -l

결과 :
135


perl로 간단하게 짜본다면 이렇게 되겟죠. 원라이너로 해보고 싶었는데 떠오르지 않는군요.

#!/usr/bin/perl
chop($docu = <STDIN>);
open(D, $docu);
@lines = <D>;
close(D);
$count = 0;
foreach(@lines){
        if($_ !~ /^#.*/ && length($_) != 1) {
                $count ++;
        }
}
print $count;

반응형