Como contar espaços no texto?
No exemplo a seguir, existem 4 espaços antes de inet.
wolf@linux:~$ ip address show eth0 | grep 'inet ' inet 10.10.10.10/24 brd 10.10.10.255 scope global dynamic eth0 wolf@linux:~$
Como faço para contar o número de espaços como este exemplo.
Esta amostra é fácil, pois tem apenas 4 espaços.
E se tiver mais do que isso? Centenas, milhares?
Existe uma maneira fácil de fazer isso?
Respostas
Você pode usar trpara excluir tudo o que não é o personagem que você está interessado, wcpara contar os caracteres restantes:
ip address show eth0 | grep 'inet ' | tr -d -c ' ' | wc -m
Isso se adapta bem a grandes quantidades de texto, tré muito eficiente.
Observe, no entanto, que com algumas implementações trincluindo GNU tr, isso só funciona corretamente para caracteres de byte único (como o caractere de espaço).
Se você quiser apenas contar espaços à esquerda, precisará de algo um pouco mais poderoso do que tr:
ip address show eth0 | grep 'inet ' | sed 's/[^ ].*$//' | tr -d '\n' | wc -m
Isso exclui todas as partes de cada linha que não são espaços à esquerda e, em seguida, exclui novas linhas e contagens.
Consulte Como contar o número de um caractere específico em cada linha? se você estiver interessado em contagens por linha.
Para contar o número de caracteres de espaço no início de cada linha, você pode fazer:
awk -F '[^ ].*' '{print length($1)}'
Que imprime o comprimento (em número de caracteres) do primeiro campo, onde os campos são separados por qualquer sequência de caracteres começando com um não-espaço.
Para relatar a quantidade máxima de espaço em branco encontrada no início de qualquer linha da entrada (o recuo máximo), com GNU wc:
sed 's/[^[:blank:]].*//' | wc -L
Isso relata essa quantidade de espaço em branco em termos de largura de exibição em um dispositivo de exibição em que as paradas de tabulação são separadas por 8 colunas:
$ printf '\tfoo\n' | sed 's/[^[:blank:]].*//' | wc -L
8
$ printf '\u3000foo\n' | sed 's/[^[:blank:]].*//' | wc -L
2
O caractere U+3000 (o caractere de espaço ideográfico, classificado como em branco em minha localidade) é um caractere de largura dupla codificado em 3 bytes em UTF-8.
Se você preferir que esse comprimento máximo seja relatado em termos de número de caracteres:
sed 's/[^[:blank:]].*//;s/./x/g' | wc -L
( s/./x/gconverte todos os caracteres em cada linha para a xqual sabemos que tem uma largura de exibição de 1).
Ou em termos de número de bytes:
sed 's/[^[:blank:]].*//' |
LC_ALL=C tr -c '\n' '[x*]' | # convert each byte other than newline to x
wc -L
Imprima o número de espaços à esquerda:
awk '{print match($0,/[^ ]|$/)-1}' filematch($0,/[^ ]|$/)corresponde ao primeiro não espaço ([^ ]) ou ao fim de linha ($) e retorna sua posição.Imprima o número de espaços:
awk -F '[ ]' '{print (NF?NF-1:0)}' file-F '[ ]'define o separador de campo como espaço.NFé o número de campos. A expressão ternária significa: "Se NF não for 0, imprima NF-1, senão imprima 0". Isso ocorre porque NF é 0 se a linha estiver vazia.
parece que o que você realmente quer é como excluir o espaço em branco principal
muitas maneiras de fazer isso, supondo que você queira fazer isso no bash, encontrei isso em
https://www.cyberciti.biz/tips/delete-leading-spaces-from-front-of-each-word.html
echo " This is a test"
# remove leading white space on the output
echo " This is a test" | sed -e 's/^[ \t]*//'
então no seu caso você poderia fazer
ip address show eth0 | grep 'inet ' | sed -e 's/^[ \t]*//'
confira também Como faço para aparar espaços em branco à esquerda e à direita de cada linha de alguma saída?
peguei o exemplo abaixo
`echo " praveen"| grep -o "^ *"| awk '{print length($0)}'`6
output
6
Pitão
>>> a=" praveen"
>>> import re
>>> k=re.compile(r'^ *')
>>> m=re.search(k,a)
>>> print len(m.group())
6
>>>
$ ip address show eth0 \
| grep -oP '^\h*(?=inet\h)' \
| wc -m;
Isso usa o GNU grep com o modo PCRE e procura por qualquer espaço em branco horizontal principal, também conhecido como [[:blank :]], seguido por inet e outro em branco. Em seguida, alimentamos wc para obter uma contagem de caracteres.
Usando gnu awk com a variável FPATH definida para uma série de espaços em branco.
$ ... |
gawk -v FPAT='\\s*' '$0=length($1)""'
Usando a compactação de lista python, também podemos alimentar o/p do grep para obter a contagem.
$ ... | python3 -c 'import sys;print(*[len(l)-len(l.lstrip()) for l in sys.stdin],sep="\n")'
Também podemos alimentar a saída do grep para o perl.
$ ..... |
perl -F'\H' -pE '$_=$F[0]=~y///c'
Aqui dividimos o registro em espaço em branco não horizontal e depois substituímos cada caractere no primeiro campo, em um contexto escalar retorna as traduções feitas. Atribua-o ao registro e faça com que a opção -p seja impressa automaticamente.