Por que o corte não está cortando na coluna da direita?

3
# uname -mrs
OpenBSD 6.0 amd64
# RANDOMNUMBER() { /usr/bin/openssl rand -hex 64 | tr -dc 0-9 | /usr/bin/cut -c-4;}
# while true; do WTF=$(/usr/bin/strings /dev/arandom | head -$(RANDOMNUMBER) | sort -R | /usr/bin/perl -pe 's/\n//g' | /usr/bin/cut -c1-63); echo "$WTF"; echo "$WTF" | wc -c; done
!+{l^RQ-QuK=iVYC\ud#pqNw?nJ"oyizU}NI5~0\HEagHv7'/6PI$|b_1)59Aj=
      64
3"fcALD'&L\#Ls7fP!Gs9Ksjv\)     ?Fm9]R#oRlEb%&=R{-zRvRE /})^uM:H9sq
      64
Q|Ik^.zuYu:|_DTt>)q48;[JVwX}F@yU)hu,~v=Wj*"ra'g=@#hJ$.ur\Ru'WMV
      64
lTYU6V2qm;[e;.dsxW+mWqf]LCylFsY,V7+71i}/6L)m<RtuCxH6,et<i[N(NV  
      64
>apV:8T e3      Y<ga$h*+9>4'kanC 35OHoG%\gG8vvWU?rM%XYuV*4?UIWVvB<!U
      64
 #b8vw:L!OvW    73/-iUPw}Ge|$ka{'E=tkTHmzb)1syK!fSN]_As'D>KGe_k<o=
      64
O5='9b}.NGChC]D{{ =^#tg7;EhzDJag'R-z/L<=LJ[h*aLI [2xPbz__+K_Bc|
      64
E\AxbSAu6seR=:-uwG$h86;r\gs(Ni0%95<O.+Yts)br9xd*>b'f    K!%Q_%+9I-
      64
8RXi=aJL3siO!PM5l]>~(5$bgp.#Z|p1,d6au-^0'mD9+Cdk@*].05g(:1,}f"R
      64
K\_a~oim<dq_^,JBjb$sYA,Icv@kOVWi2'z+us2BzW|~@l+iD3@euM|iS;"0tw&
      64
bI[Aev\{[YN"a^$)j'W[r?Ey[ !Jn32V6'PE(6WAqL~NYg&/{J-w > _uAS}i
      64
I|jm@onzPfAhK5HJq:V     h<p-<_oPvS68)2L\&4)CWM|GYv0l}8= 7 ZpW wH}UR
      64
i_x?KW3<v7/Pw   w6>gXw7#HE]n,d4mj8'my@)*15m]dK(+9[o!h<w^ $$PS)Q4@
      64
wJ1pv[3sHJrpXV=c-c{2%0A,F-.3;'M^cvV6E&|B"'@V+RYs        dlS*yEqsV_      $G6
      64
M_iq/+  |>*@CC4G.-?9s@;0tR^>&dh]5,sQu.8akCJU01qxiX5TUe&}=I_K;X%'
      64
^C
# 

A partir disso, não consigo entender algumas linhas (executá-lo manualmente ...):

# echo '>apV:8T e3      Y<ga$h*+9>4'kanC 35OHoG%\gG8vvWU?rM%XYuV*4?UIWVvB<!U' | wc -c
      69
# 
# echo 'wJ1pv[3sHJrpXV=c-c{2%0A,F-.3;'M^cvV6E&|B"'@V+RYs        dlS*yEqsV_      $G6' | wc -c
      76
# 

Por que "cortar" faz uma coisa dessas? Eu pedi para cortar 63 caracteres. Mas às vezes dá linhas mais longas que 63 que eu posso provar selecionando manualmente a saída, colocando-a em um eco e usando "| wc -c" .. talvez haja um erro no comando "cut" em relação a espaços?

Para o primeiro exemplo de linha manual, o script top dá 64, mas verificá-lo manualmente revela que ele é na verdade 69.

    
por pepite 03.11.2016 / 11:34

1 resposta

6

Você tem guias lá; Cada guia conta como um caractere do ponto de vista de cut , mas pode ocupar mais espaço do que na tela. Além disso, ocupa uma quantidade que varia dependendo de onde na linha é produzida ...

Cada linha que aparece com mais de 64 caracteres tem uma lacuna correspondente que se alinha com uma tabstop (oito caracteres na maioria dos ambientes até o momento neste século):

3"fcALD'&L\#Ls7fP!Gs9Ksjv\)     ?Fm9]R#oRlEb%&=R{-zRvRE /})^uM:H9sq
                           ^ tab here
                                ^ tabstop here
1234567812345678123456781234567812345678123456781234567812345678

Quando você copiou e colou a saída do seu segundo conjunto de medições, os espaços para os quais as guias foram expandidas foram copiados, portanto, wc -c contaram essas.

    
por 03.11.2016 / 11:38

Tags