Supposons qu'il existe une commande telle que:
cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG
La sortie est en tant que telle:
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
Maintenant, ma question est: Y a-t-il des commandes qui n'imprimeront que ce qui est à l'intérieur des virgules inversées, c'est-à-dire " "
?
Et pourriez-vous expliquer un peu la commande? Je vous remercie! en avance.
command-line
text-processing
Raphael
la source
la source
cat
dans une pipe est presque toujours un gaspillage de ressources (AKA UUOC );grep
peut déjà lire son entrée à partir d'un fichier (c'est-àgrep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic
- dire fait exactement la même chose, mais 1. Il est plus court 2. Il est plus facile à comprendre 3. Il ne crée pas de shell supplémentaire ni de processus supplémentaire). Dans 99% des cas, utiliser cat au début de la pipe sans concaténer plusieurs fichiers est juste dangereux. :)cat
, bien qu'inutile dans ce cas, rendrait l'édition de la ligne de commandes plus facile à l'avenir au cas où vous voudriez changer / ajouter / supprimer quelque chose plus tard, peut-être untr
oucut
, etc., pas besoin de trouver et déplacer le nom de fichier , assurez-vous que l'autre commande le prend en charge, trouvez où le mettre, etc. Et pour un petit fichier de test, il n'ajoute que 0,002 s. (J'ai probablement passé plus de temps à taper cela que je n'encat
cat
aide ici? Vous pouvez le fairegrep foo file | tr
ou... | cut
tout aussi facilement quecat file | tr | grep ...
. Lecat
ajoute simplement cinq caractères supplémentaires, un canal supplémentaire et un appel de programme supplémentaire et ne simplifie rien.Réponses:
Oui, tu peux faire ça. Votre commande serait:
qui ne retournerait que:
La
awk
commande utilise des séparateurs de champs avec la-F
commande, et pour la configurer pour utiliser des guillemets doubles, vous la tapez avec des guillemets simples autour d'elle comme-F'"'
. Ensuite, le'{print $2}'
awk indique d'imprimer le deuxième ensemble après le séparateur de champ.J'espère que cela t'aides!
la source
cat
etgrep
. Vous pouvez remplacercat
et vousgrep
séparerawk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic
. Moins de plomberie, laissant AWK faire tout le travail, ce qu'elle est plus que capable de faireawk
commande. =)Vous pouvez le faire avec une seule
grep
commande:Ou (un peu plus long et plus convulsé):
-P
: indiquegrep
d'interpréter le modèle comme un PCRE (expression régulière compatible Perl);-o
: indiquegrep
de n'imprimer que la correspondance;^CONFIG_ARCH_DEFCONFIG="
: correspond à uneCONFIG_ARCH_DEFCONFIG="
chaîne au début de la ligne;\K
: supprime la sous-chaîne précédemment mise en correspondance;#1:
[^"]*
: correspond à n'importe quel nombre de n'importe quel caractère non"
(avec avidité).# 2:
.*?
: correspond à n'importe quel nombre de n'importe quel caractère (paresseusement);(?=")
: lookahead (assertion de longueur nulle, elle ne correspond à aucun caractère); correspond si le caractère suivant est a"
.la source
Il existe de nombreuses façons de dépouiller ce chat, voici une
sed
façon:Ici, nous faisons correspondre la ligne et capturons la partie souhaitée, c'est-à-dire la partie entre guillemets doubles (
([^"]+)
), puis nous remplaçons la ligne entière par le groupe capturé (\1
) uniquement.Exemple:
la source
Quoi, non
perl
?Le
perl
va-p
imprimer chaque ligne après avoir appliqué le script donné par-e
. Les/foo/bar/
remplacerafoo
parbar
. Les motifs entre parenthèses sont "capturés" et peuvent être appelés$1
,$2
...$N
où$1
est le premier motif capturé,$2
le deuxième etc. L'expression régulière recherchera tout jusqu'à la première citation (.*?"
), puis capturera 0 ou plusieurs"
caractères non ([^"]*
) puis tout le reste. Le tout est remplacé par le motif capturé.Vous pouvez également laisser le motif correspondant à
perl
:la source
with open('/boot/config-3.19.0-32-generic') as f: for line in f: if line.startswith('CONFIG_ARCH_DEFCONFIG'): print line.split('"')[1]
Voici une combinaison de
grep
etcut
qui fait le même travail.Explication:
grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic
est la partie qui trouve la ligne, dans la syntaxe standard de grep:grep [OPTIONS] PATTERN [FILE...]
. La sortie passe par le tuyau à l'étape suivantecut -d"\"" -f2
. Cette partie utilise du texte coupé à rogner séparé par un délimiteur spécifique (spécifié avec un-d
indicateur). Nous devons échapper au guillemet double avec barre oblique inverse afin que le shell permette de prendre le guillemet double comme l'une des options de lacut
commande, plutôt que d'entrer dans le shell lui-même. Maintenant ,cut
traitera de sortiegrep
comme séparés par"
et divisée en trois colonnes,CONFIG_ARCH_DEFCONFIG
,arch/x86/configs/x86_64_defconfig
et l' espace vide. La ligne dont nous avons besoin est la deuxième colonne, cela signifie que nous devons utiliser le-f2
drapeau.la source
Puisque j'apprends actuellement,
python
voici une version utilisant exactement cela.Exemple d'exécution:
la source
line.startswith
car ilre.match
est beaucoup plus lent questartswith