Como executar o grep na saída do ldd corretamente?

2
# ldd /usr/bin/ffmpeg
    linux-vdso.so.1 =>  (0x00007ffffc1fe000)
    libavfilter.so.0 => not found
    libpostproc.so.51 => not found
    libswscale.so.0 => not found
    libavdevice.so.52 => not found
    libavformat.so.52 => not found
    libavcodec.so.52 => not found
    libavutil.so.49 => not found
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdd18259000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdd1803a000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdd17c75000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fdd18583000)

Eu estou tentando grep apenas os nomes deixados pelo "= >" símbolo.

Funciona com o eco facilmente:

echo linux-vdso.so.1 | grep -oP "^[a-z0-9.]*"
linux-vdso.so.1

Mas quando executo o mesmo RegEx na saída do ldd, ele exibe qualquer coisa:

ldd /usr/bin/ffmpeg | grep -oP "^[a-z0-9.]*"

Então eu pensei, talvez eu tenha que incluir algum espaço em branco

ldd /usr/bin/ffmpeg | grep -oP "^([a-z0-9.]|\w)*"

Mas isso não funcionou e eu não sei mais ...

    
por Abdul Al Hazred 02.04.2015 / 19:18

3 respostas

4

A melhor solução para isso é usar awk :

$ ldd /usr/bin/ppdhtml | awk '/ => / { print $1 }' | head -n1
libcupsppdc.so.1

Para fazer isso usando grep , você precisará usar os recursos lookahead e lookbehind do PCRE:

$ ldd /usr/bin/ppdhtml | grep -Po '(?<=\t).+(?= => )' | head -n1
libcupsppdc.so.1

Os recursos lookahead e lookbehind afetam essa correspondência, mas não são incluídos na partida. Observe também que isso não funcionaria se ldd usasse um número variável de espaços em vez de guias no início da linha. Lookbehinds não pode ter um tamanho variável.

    
por 02.04.2015 / 19:32
2

Você tem que usar \s em vez de \w (que corresponde a um caractere de palavra) para corresponder a qualquer caractere considerado como espaço em branco, inclua [\t\n\f\r ] :

ldd /usr/bin/ffmpeg | grep -oP "^([a-z0-9.-]|\s)*"

ou:

ldd /usr/bin/ffmpeg | grep -oP "^\s*[a-z0-9.-]*"
    
por 02.04.2015 / 19:33
2

Uma possibilidade, use cut:

$ cat junk.txt

linux-vdso.so.1 = > (0x00007ffffc1fe000)

libavfilter.so.0 => not found
libpostproc.so.51 => not found
libswscale.so.0 => not found
libavdevice.so.52 => not found
libavformat.so.52 => not found
libavcodec.so.52 => not found
libavutil.so.49 => not found
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdd18259000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdd1803a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdd17c75000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdd18583000)

$ cat junk.txt | corte -d '=' -f1

libavfilter.so.0

libpostproc.so.51 

libswscale.so.0 

libavdevice.so.52 

libavformat.so.52 

libavcodec.so.52 

libavutil.so.49 

libm.so.6 

libpthread.so.0 

libc.so.6 

/lib64/ld-linux-x86-64.so.2 (0x00007fdd18583000)
    
por 02.04.2015 / 20:28