Você pode usar a opção -c do grep. E você pode remover todos os chars até a primeira vírgula e tudo a partir da segunda vírgula com sed :
sed 's/^[^,]*,//;s/,.*//' < the_file | grep -c -E '[^0]'
EDIT: Este comando sed faz o mesmo que o seu comando cut , então você também deve poder usar o comando grep original.
EDIT2: Se você quiser usar apenas um comando, você pode usar @cuonglm grp answer. Se você quiser usar somente uma invocação de sed , haverá muito trabalho com rótulos para somar a contagem de linhas no final.
sed -E -n '
s/^[^,]*,[^0,]+,.*/+1/ # replace the lines we are interested in with "+1"
T delete_line # if we did not do a substitution right now we jump to "delete_line"
H # we did not jump (so we did the substitution and append the "+1" to the hold space
: delete_line # the label, here we do nothing (silently drop the current line)
$ { # on the last line we ...
s/.*/0/ # replace the whole line with "0"
G # append the hold space (all the "+1" from before")
s/\n//g # remove all newlines
p # print the line
}' < the_file
Isso agora pode ser canalizado para bc ou você pode substituir o comando p por alguma% complicada desed magic para somar esses números em sed . Acredito que ouvi dizer que sed está em andamento, por isso deve ser possível.
Se você quiser usar apenas um programa ( sed ), mas não se importar em invocá-lo várias vezes, é muito mais fácil:
sed '/^[^,]*,0,.*/d' < the_file | sed -n '$='