Como usar o grep para retornar linhas com um número hexadecimal em um determinado intervalo?

3

Se eu tiver, digamos:

blah;PC=1234abcd
PC=4444bbcd;blah
PC=0000abcd;;foo
PC=1234abff

Como faço para grep para linhas com valores de PC em um determinado intervalo, digamos 1234ab00 a 1234b0ff .

A opção - range parece aplicar-se apenas à ordem normal 0-9a-A , o que obviamente não funcionará para intervalos hexadecimais.

    
por Lolo 11.12.2015 / 16:34

2 respostas

2
grep -f <(printf "%x\n" $(seq -f "%.f" $(printf "%d %d" 0x1234ab00 0x1234b0ff))) file
  • O printf interno imprime valores decimais dos dois valores hexadecimais.
  • Em seguida, seq imprime tudo entre eles, em decimal.
  • O% externo printf imprime valores hexadecimais para todos esses valores decimais.
  • E, finalmente, grep -f procura por todos esses padrões no file .

A saída:

blah;PC=1234abcd
PC=1234abff
    
por 11.12.2015 / 17:10
3

Eu usaria perl em vez disso:

perl -ne 'print if /PC=([\da-fA-F]+)/ &&
                   ($n=hex $1) >= 0x1234ab00 &&
                    $n <= 0x1234b0ff'

Com grep , seria bastante complicado e você teria que adaptar o regexp para todos os intervalos, como:

LC_ALL=C grep -E 'PC=0*1234([aA][b-fB-F]|[bB]0)[0-9a-fA-F]{2}([^0-9a-fA-F]|$)'

Os intervalos dentro das expressões de colchetes aplicam-se apenas aos caracteres. As expressões de colchetes correspondem apenas a um caractere (bem, elemento de agrupamento). Na localidade C [0-9] é a abreviação de [0123456789] , portanto, corresponde a um desses 10 caracteres de dígitos arábicos. [0-25] é [0125] então corresponde a qualquer um dos 0, 1, 2, 5.

    
por 11.12.2015 / 17:00