Stampa una parte specifica in un'uscita

11

Supponiamo che ci sia un comando come:

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

L'output è così:

CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"

Ora, la mia domanda è: ci sono dei comandi che stamperanno solo ciò che è dentro le virgolette, cioè " " ?

E potresti per favore spiegare un po 'il comando? Grazie! in anticipo.

    
posta Raphael 25.12.2015 - 07:00
fonte

6 risposte

15

Sì, puoi farlo. Il tuo comando sarebbe:

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

che restituirebbe solo:

arch/x86/configs/x86_64_defconfig

Il comando awk utilizza i separatori di campo con il comando -F , e per impostarlo in modo da usare virgolette doppie, lo inserisci tra virgolette attorno ad esso come -F'"' . Quindi '{print $2}' dice a awk di stampare il secondo set dopo il separatore di campo.

Spero che questo aiuti!

    
risposta data Terrance 25.12.2015 - 07:17
fonte
11

Puoi farlo con un singolo comando grep :

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

O (un po 'più lungo e più convulso):

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-3.19.0-32-generic
  • -P : indica grep per interpretare il modello come un PCRE (espressione regolare compatibile Perl);
  • -o : indica grep per stampare solo la corrispondenza;
  • ^CONFIG_ARCH_DEFCONFIG=" : corrisponde a una stringa CONFIG_ARCH_DEFCONFIG=" all'inizio della riga;
  • \K : scarta la sottostringa precedentemente associata;

# 1:

  • [^"]* : corrisponde a qualsiasi numero di qualsiasi carattere non " (avidamente).

# 2:

  • .*? : corrisponde a qualsiasi numero di qualsiasi carattere (pigramente);
  • (?=") : lookahead (asserzione a lunghezza zero, non corrisponde a nessun carattere); corrisponde se il seguente carattere è un " .
% 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
    
risposta data kos 25.12.2015 - 09:51
fonte
10

Ci sono molti modi per skinare questo gatto, ecco un modo sed :

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

Qui stiamo abbinando la linea e catturando la porzione desiderata, cioè la parte tra virgolette ( ([^"]+) ) e quindi sostituendo l'intera linea con il gruppo catturato ( ).

Esempio:

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

Cosa, no perl ?

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

Il perl sarà -p rint ogni riga dopo aver applicato lo script dato da -e . % Co_de% sostituirà s/foo/bar/ con foo . I pattern tra parentesi sono "catturati" e possono essere indicati come bar , $1 ... $2 dove $N è il primo modello catturato, $1 il secondo ecc. L'espressione regolare cercherà tutto fino alla prima citazione ( $2 ), quindi acquisisci 0 o più caratteri non .*?" ( " ) e poi tutto il resto. Il tutto viene sostituito con il modello catturato.

Puoi anche lasciare il pattern matching a [^"]* :

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

Ecco una combinazione di grep e cut , che fa lo stesso lavoro.

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

Spiegazione:

  • grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic è la parte che trova la linea, nella sintassi standard di grep: grep [OPTIONS] PATTERN [FILE...] . L'output passa attraverso la pipe alla fase successiva
  • %codice%. Questa parte usa testo tagliato in ritaglio separato da delimitatore specifico (che viene specificato con cut -d"\"" -f2 flag). Dobbiamo sfuggire alla doppia citazione con backslash in modo che la shell consenta di utilizzare la doppia quotazione come una delle opzioni del comando -d , piuttosto che l'input della shell stessa. Ora cut tratterà l'output da cut come separato da grep e diviso in tre colonne, " , CONFIG_ARCH_DEFCONFIG e spazio vuoto. La linea di cui abbiamo bisogno è la seconda colonna, il che significa che dobbiamo usare arch/x86/configs/x86_64_defconfig flag.
risposta data Sergiy Kolodyazhnyy 25.12.2015 - 07:52
fonte
3

Dato che attualmente sto imparando python qui c'è una versione che usa esattamente questo.

#!/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]

Esecuzione di esempio:

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]
    
risposta data Sergiy Kolodyazhnyy 22.01.2016 - 03:30
fonte

Leggi altre domande sui tag