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.
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!
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
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
Quoi, pas de Perl
name__?
grep CONFIG_Arch_DEFCONFIG /boot/config-3.19.0-32-generic |
Perl -pe 's/.*?"([^"]*).*/$1/'
Perl
-p
rint chaque ligne après l'application du script donné par -e
. Le s/foo/bar/
remplacera foo
par bar
name__. Les modèles entre parenthèses sont "capturés" et peuvent être appelés $1
, $2
... $N
où $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 à Perl
name__:
Perl -ne 's/.*CONFIG_Arch_DEFCONFIG="([^"]*).*/$1/ && print' /boot/config-3.19.0-32-generic
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 suivantecut -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
.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]