Contar nul itens delimitados no arquivo

8

Eu tenho um script de shell que usa find -print0 para salvar uma lista de arquivos a serem processados em um arquivo temporário. Como parte do registro, gostaria de mostrar o número de arquivos encontrados e, portanto, preciso de uma maneira de obter essa contagem. Se a opção -print0 não estivesse sendo usada para segurança, eu poderia usar wc -l para obter a contagem.

    
por qqx 30.10.2014 / 14:35

3 respostas

10

Algumas opções:

tr -cd '
tr -cd '%pre%' | wc -c

tr '\n%pre%' '%pre%\n' | wc -l      # Generic approach for processing NUL-terminated
                              # records with line-based utilities (that support
                              # NUL characters in their lines like GNU ones).

grep -cz '^'                  # GNU grep

sed -nz '$='                  # recent GNU sed, no output for empty input

awk -vRS='%pre%' 'END{print NR}' # not all awk implementations
' | wc -c tr '\n%pre%' '%pre%\n' | wc -l # Generic approach for processing NUL-terminated # records with line-based utilities (that support # NUL characters in their lines like GNU ones). grep -cz '^' # GNU grep sed -nz '$=' # recent GNU sed, no output for empty input awk -vRS='%pre%' 'END{print NR}' # not all awk implementations

Observe que, para uma entrada que contém dados após o último caractere NUL (ou entrada não vazia sem caracteres NUL), as abordagens tr sempre contarão o número de caracteres NUL, mas o awk / sed / grep abordagens contará um registro extra para esses bytes extras.

    
por 30.10.2014 / 14:42
4

O melhor método que consegui pensar é usar grep -zc '.*' . Isso funciona, mas parece errado usar o grep com um padrão que combine com qualquer coisa.

    
por 30.10.2014 / 14:35
1

com perl :

perl -0ne 'END {print $.}'

ou:

perl -nle 'print scalar split "
perl -nle 'print scalar unpack "(Z*)*", $_'
"'

ou:

perl -0ne 'END {print $.}'
    
por 30.10.2014 / 19:31