web-dev-qa-db-fra.com

Imprimer une pièce spécifique dans une sortie

Supposons qu'il existe une commande telle que:

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

La sortie est comme telle:

CONFIG_Arch_DEFCONFIG="Arch/x86/configs/x86_64_defconfig"

Ma question est la suivante: existe-t-il des commandes qui n’imprimeront que ce qui est à l’intérieur des guillemets, c’est-à-dire " "?

Et pourriez-vous s'il vous plaît expliquer la commande un peu? Je vous remercie! en avance.

11
Raphael

Oui, tu peux faire ça. Votre commande serait:

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

qui ne renverrait que:

Arch/x86/configs/x86_64_defconfig

La commande awk utilise des séparateurs de champ avec la commande -F et pour la définir de manière à utiliser les guillemets doubles, vous devez la saisir avec des guillemets simples comme -F'"'. Ensuite, le '{print $2}' indique à awk d’imprimer le deuxième jeu après le séparateur de champs.

J'espère que cela t'aides!

15
Terrance

Vous pouvez le faire avec une seule commande grep:

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

Ou (un peu plus long et plus convulté):

grep -Po '^CONFIG_Arch_DEFCONFIG="\K.*?(?=")' /boot/config-3.19.0-32-generic
  • -P: indique à grep d'interpréter le motif en tant qu'expression régulière PCRE (Perl Compatible Regular Expression);
  • -o: indique à grep de n'imprimer que la correspondance;
  • ^CONFIG_Arch_DEFCONFIG=": correspond à une chaîne CONFIG_Arch_DEFCONFIG=" au début de la ligne;
  • \K: ignore la sous-chaîne précédemment trouvée;

#1:

  • [^"]*: correspond à un nombre quelconque de caractères autres que " (goulûment).

# 2:

  • .*?: correspond à un nombre quelconque de caractères (paresseusement);
  • (?="): lookahead (assertion de longueur nulle, elle ne correspond à aucun caractère); correspond si le caractère suivant est 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
11
kos

Il y a beaucoup de façons de peauner ce chat, voici une façon sed:

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

Ici, nous faisons correspondre la ligne et capturons la partie souhaitée, c’est-à-dire la partie entre guillemets (([^"]+)), puis remplaçons uniquement la ligne entière par le groupe capturé (\1).

Exemple:

% sed -nr 's/^CONFIG_Arch_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.13.0-32-generic
Arch/x86/configs/x86_64_defconfig
10
heemayl

Quoi, pas de Perlname__?

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

Perl-print chaque ligne après l'application du script donné par -e. Le s/foo/bar/ remplacera foopar barname__. Les modèles entre parenthèses sont "capturés" et peuvent être appelés $1, $2 ... $N$1 est le premier modèle capturé, $2 le deuxième, etc. L'expression régulière recherchera tout jusqu'à la première citation (.*?"), puis capture 0 ou plus caractères non -" ([^"]*) et tout le reste. Le tout est remplacé par le motif capturé.

Vous pouvez également laisser le modèle correspondant à Perlname__:

Perl -ne 's/.*CONFIG_Arch_DEFCONFIG="([^"]*).*/$1/ && print' /boot/config-3.19.0-32-generic
10
terdon

Voici une combinaison de grep et cut, qui fait le même travail.

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

Explication:

  • grep "CONFIG_Arch_DEFCONFIG" /boot/config-3.19.0-32-generic est la partie qui trouve la ligne, dans la syntaxe grep standard: grep [OPTIONS] PATTERN [FILE...]. La sortie passe par le tuyau à l'étape suivante
  • cut -d"\"" -f2. Cette partie utilise un texte coupé pour rogner, séparé par un délimiteur spécifique (spécifié avec l'indicateur -d). Nous devons échapper à la double guillemet avec une barre oblique inversée pour que Shell autorise l'utilisation de la guillemet double comme l'une des options de la commande cut, plutôt que de la saisir dans le shell lui-même. Désormais, cut traitera la sortie de grep comme étant séparée par " et divisée en trois colonnes, CONFIG_Arch_DEFCONFIG, Arch/x86/configs/x86_64_defconfig et un espace vide. La ligne dont nous avons besoin est la deuxième colonne, ce qui signifie que nous devons utiliser le drapeau -f2.
8
Sergiy Kolodyazhnyy

Depuis que je suis en train d'apprendre python, voici une version utilisant exactement cela.

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

Échantillon échantillon:

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]
3
Sergiy Kolodyazhnyy