grep -c 는 일치 횟수가 아니라 줄 수를 센다

사이트 세 곳에 같은 추적 스니펫을 넣고 잘 들어갔는지 셌다.

ttakochan.com                1
longshort.ttakochan.com      1
counter.ttakochan.com        1

스니펫은 <head> 에 한 번, <body> 직후에 한 번 들어간다. 그런데 전부 1 이 나왔다.

여기서 대개 의심하는 것

배포가 덜 됐나. 캐시를 우회해서 다시 찍어봤지만 그대로 1 이었다.

<body> 쪽 삽입이 빠졌나 싶어 소스를 열어봤다. 멀쩡히 들어 있었다.

실제 원인

이렇게 셌다.

curl -sL "https://ttakochan.com" | grep -c "GTM-K2W8SLR2"

grep -c일치한 줄의 수를 센다. 한 줄에 열 번 나와도 1 이다.

한 사이트는 2, 나머지는 1 이 나오던 시점도 있었는데 그것도 같은 이유였다. Astro 가 만든 HTML 은 줄바꿈이 살아 있어 스니펫이 두 줄에 걸쳤다. Next.js 쪽은 압축돼 한 줄이라 1 로 나왔다. 코드 차이가 아니라 줄바꿈 차이였다.

처방

일치 횟수를 세려면 -o 로 쪼갠 뒤 줄을 센다.

curl -sL "https://ttakochan.com" | grep -o "GTM-K2W8SLR2" | wc -l

-o 는 일치한 부분만 한 줄씩 출력한다. 그 줄을 세면 실제 횟수다.

바꿔서 다시 재니 이렇게 나왔다.

ttakochan.com                2
longshort.ttakochan.com      4
counter.ttakochan.com        2

전부 정상이었다. 4 가 나온 곳은 Next.js 라 HTML 과 RSC 페이로드 양쪽에 마크업이 들어가서 그렇다. 그건 별개 얘기다.

왜 헷갈리나

-c 를 count 로 읽게 된다. 대부분의 도구에서 count 는 개수다.

그리고 평소에는 결과가 맞다. 로그 파일처럼 한 줄에 한 번씩 나오는 대상이라면 줄 수와 횟수가 같다. 어긋나는 건 압축된 HTML 이나 minify 된 JS 처럼 한 줄이 긴 파일뿐이다.

파일을 세는 습관 그대로 HTML 에 쓰면 조용히 틀린 답이 나온다. 오류도 안 난다. 0 이 아니니 “들어는 갔구나” 하고 넘어가게 된다.

같이 헷갈리는 것

grep -c 는 파일이 여러 개면 파일마다 따로 센다.

grep -c "GTM" a.html b.html
a.html:1
b.html:1

전체 합계가 아니다. 합계를 원하면 이렇게 한다.

cat a.html b.html | grep -o "GTM" | wc -l

남은 것

grep 자체에는 일치 횟수를 바로 주는 옵션이 없다. -o | wc -l 이 관용구인데, 이게 관용구라는 것 자체가 좀 이상하다고 생각한다.

← 블로그 목록