Imprime uma parte específica em uma saída

11

Vamos supor que exista um comando como:

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG

A saída é assim:

CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"

Agora, minha pergunta é: Existe algum comando que imprima apenas o que está dentro das aspas, ou seja, " " ?

E você poderia por favor explicar o comando um pouco? Obrigado! antecipadamente.

    
por Raphael 25.12.2015 / 07:00

6 respostas

15

Sim, você pode fazer isso. Seu comando seria:

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG | awk -F'"' '{print }'

que retornaria apenas:

arch/x86/configs/x86_64_defconfig

O comando awk usa separadores de campo com o comando -F e, para defini-lo para usar aspas duplas, você o digita com aspas simples em torno dele, como -F'"' . Então o '{print }' diz ao awk para imprimir o segundo conjunto após o separador de campo.

Espero que isso ajude!

    
por Terrance 25.12.2015 / 07:17
11

Você pode fazer isso com um único comando grep :

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-3.19.0-32-generic

Ou (um pouco mais longo e mais convincente):

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-3.19.0-32-generic
  • -P : informa grep para interpretar o padrão como um PCRE (Perl Compatible Regular Expression);
  • -o : informa grep para imprimir apenas a correspondência;
  • ^CONFIG_ARCH_DEFCONFIG=" : corresponde a uma string CONFIG_ARCH_DEFCONFIG=" no início da linha;
  • \K : descarta a substring correspondida anteriormente;

# 1:

  • [^"]* : corresponde a qualquer número de qualquer caractere que não seja " (avidamente).

# 2:

  • .*? : corresponde a qualquer número de qualquer caractere (preguiçosamente);
  • (?=") : lookahead (asserção de comprimento zero, não combina com nenhum caractere); corresponde se o caractere a seguir for um " .
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig
    
por kos 25.12.2015 / 09:51
10

Há muitas maneiras de eliminar esse gato, aqui está uma maneira sed :

sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$//p' /boot/config-3.19.0-32-generic

Aqui estamos combinando a linha e capturando a parte desejada, ou seja, a parte entre aspas duplas ( ([^"]+) ) e depois substituindo a linha inteira apenas pelo grupo capturado ( ).

Exemplo:

% sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$//p' /boot/config-3.13.0-32-generic
arch/x86/configs/x86_64_defconfig
    
por heemayl 25.12.2015 / 12:20
10

O que, não, perl ?

grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic | 
    perl -pe 's/.*?"([^"]*).*//'

O perl irá -p de cada linha depois de aplicar o script fornecido por -e . O s/foo/bar/ substituirá foo por bar . Padrões entre parênteses são "capturados" e podem ser referidos como , ... $N onde é o primeiro padrão capturado, o segundo etc. A expressão regular procurará por tudo até a primeira cotação ( .*?" ), então capture 0 ou mais caracteres não- " ( [^"]* ) e depois todo o resto. A coisa toda é substituída pelo padrão capturado.

Você também pode deixar o padrão correspondente a perl :

perl -ne 's/.*CONFIG_ARCH_DEFCONFIG="([^"]*).*// && print' /boot/config-3.19.0-32-generic
    
por terdon 25.12.2015 / 15:21
8

Aqui está uma combinação de grep e cut , que faz o mesmo trabalho.

$ grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic | cut -d"\"" -f2                                                
arch/x86/configs/x86_64_defconfig

Explicação:

  • grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic é a parte que encontra a linha na sintaxe padrão do grep: grep [OPTIONS] PATTERN [FILE...] . A saída passa pelo pipe para o próximo estágio
  • %código%. Esta parte usa o texto recortado para recortar separado por um delimitador específico (que é especificado com cut -d"\"" -f2 flag). Temos que escapar da aspas duplas com barra invertida para que o shell permita usar aspas duplas como uma das opções para o comando -d , em vez de inserir no próprio shell. Agora, cut tratará a saída de cut como separado por grep e dividirá em três colunas, " , CONFIG_ARCH_DEFCONFIG e espaço vazio. A linha que precisamos é a segunda coluna, o que significa que precisamos usar arch/x86/configs/x86_64_defconfig flag.
por Sergiy Kolodyazhnyy 25.12.2015 / 07:52
3

Como atualmente estou aprendendo python , aqui está uma versão que usa exatamente isso.

#!/usr/bin/env python
import re

reg = re.compile('CONFIG_ARCH_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]

Execução da amostra:

DIR:/TECH-BOOKS
skolodya@ubuntu:$ ./extractString.py                                           
arch/x86/configs/x86_64_defconfig

DIR:/TECH-BOOKS
skolodya@ubuntu:$ cat ./extractString.py                                       
#!/usr/bin/env python
import re

reg = re.compile('CONFIG_ARCH_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]
    
por Sergiy Kolodyazhnyy 22.01.2016 / 03:30