Então peguei sua string hexadecimal e a imprimi em bytes, mas troquei as NULs por < espaços > (principalmente porque não consigo entender como obter um NUL em um padrão grep
) :
time \
( set x58 x5e x20 x20 xfe x5a x1e xda \
x48 x20 x20 x20 x0d x20 x03 x20 \
x07 x20 x20 x20 xcd x01 x20 x20
export grep="$(shift;IFS=\;printf "\$*")" \
tr='9990
1.06s user 0.94s system 65% cpu 3.054 total
\a\rHXZ^526' \
LC_ALL=C i=0
while [ "$((i+=1))" -lt 1000 ]
do cat 0002.raw; done |
tr -cd "$tr" |tr 'Xtime \
( set x58 x5e x20 x20 xfe x5a x1e xda \
x48 x20 x20 x20 x0d x20 x03 x20 \
x07 x20 x20 x20 xcd x01 x20 x20
export LC_ALL=C i=0 grep="$(IFS=\;printf "\$*")"
while [ "$((i+=1))" -lt 1000 ]
do cat 0002.raw; done |
tr '9990
1.56s user 1.46s system 82% cpu 3.648 total
' ' time \
( set x58 x5e x20 x20 xfe x5a x1e xda \
x48 x20 x20 x20 x0d x20 x03 x20 \
x07 x20 x20 x20 xcd x01 x20 x20
export LC_ALL=C i=0 grep="$(IFS=\;printf "\$*")"
while [ "$((i+=1))" -lt 1000 ]
do cat 0002.raw; done |
tr '...
241133568:X^ 6Z62H \r time \
( set x58 x5e x20 x20 xfe x5a x1e xda \
x48 x20 x20 x20 x0d x20 x03 x20 \
x07 x20 x20 x20 xcd x01 x20 x20
export grep="$(shift;IFS=\;printf "\$*")" \
tr='9990
1.06s user 0.94s system 65% cpu 3.054 total
\a\rHXZ^526' \
LC_ALL=C i=0
while [ "$((i+=1))" -lt 1000 ]
do cat 0002.raw; done |
tr -cd "$tr" |tr 'Xtime \
( set x58 x5e x20 x20 xfe x5a x1e xda \
x48 x20 x20 x20 x0d x20 x03 x20 \
x07 x20 x20 x20 xcd x01 x20 x20
export LC_ALL=C i=0 grep="$(IFS=\;printf "\$*")"
while [ "$((i+=1))" -lt 1000 ]
do cat 0002.raw; done |
tr '9990
1.56s user 1.46s system 82% cpu 3.648 total
' ' time \
( set x58 x5e x20 x20 xfe x5a x1e xda \
x48 x20 x20 x20 x0d x20 x03 x20 \
x07 x20 x20 x20 xcd x01 x20 x20
export LC_ALL=C i=0 grep="$(IFS=\;printf "\$*")"
while [ "$((i+=1))" -lt 1000 ]
do cat 0002.raw; done |
tr '...
241133568:X^ 6Z62H \r %pre%3 \a 5%pre%1 $
241157720:X^ 6Z62H \r %pre%3 \a 5%pre%1 $
241181872:X^ 6Z62H \r %pre%3 \a 5%pre%1 $
241206024:X^ 6Z62H \r %pre%3 \a 5%pre%1 $
241230176:X^ 6Z62H \r %pre%3 \a 5%pre%1 $
241254328:X^ 6Z62H \r %pre%3 \a 5%pre%1 $
1.59s user 1.41s system 85% cpu 3.496 total
' ' %pre%' |
grep -baFo "$grep" | sed -n l
)
' |
grep -aFo "$grep"| wc -l
)
' '\n ' |
cut -c-23 |grep -xFc "$grep"
)
3 \a 5%pre%1 $
241157720:X^ 6Z62H \r %pre%3 \a 5%pre%1 $
241181872:X^ 6Z62H \r %pre%3 \a 5%pre%1 $
241206024:X^ 6Z62H \r %pre%3 \a 5%pre%1 $
241230176:X^ 6Z62H \r %pre%3 \a 5%pre%1 $
241254328:X^ 6Z62H \r %pre%3 \a 5%pre%1 $
1.59s user 1.41s system 85% cpu 3.496 total
' ' %pre%' |
grep -baFo "$grep" | sed -n l
)
' |
grep -aFo "$grep"| wc -l
)
' '\n ' |
cut -c-23 |grep -xFc "$grep"
)
A variável tr
é composta de caracteres octal escapes / ASCII para os valores de byte de sua string hexadecimal porque eu queria que tr
to -d
elete seu complemento. Eu então me certifiquei de que a linha mais longa grep
poderia tentar corresponder seria -c-23
bytes com cut
, e que a string sempre encabeçaria uma linha por tr
anslating X chars para \n
ewlines enquanto também trocar as NULs por < espaços & gt ;.
Estou cat
ing o binário bruto no pipeline 999 vezes aqui. Como existem 10 correspondências no arquivo, os resultados são:
%pre%
Agora eu também testei ...
%pre%
Eu uso wc -l
, mas nos meus testes não pareceu fazer nenhuma diferença na hora de usar -caFo
e% wc
. As contagens eram as mesmas, de qualquer maneira. Os resultados para isso:
%pre%
Agora, esses dois conjuntos de comandos não são equivalentes. Embora pareça ser um pouco mais rápido ao eliminar bytes indesejados com tr
primeiro, uma coisa que significa é que, enquanto você pode obter a contagem, não é possível obter os deslocamentos, adicionando a -b
à grep
no segundo exemplo ...
%pre%
%pre%
E o que você escolher, eu acho, vai depender do que você quiser. Por apenas uma contagem, provavelmente o tr -cd
será melhor - completou de forma confiável meio segundo mais rápido que o outro a cada vez - mas não é tão versátil, e talvez, se o seu grep
suportá-lo, grep -baFo
poderia ser o que você precisa em vez disso.