Je veux imprimer une partie d'une ligne dans un fichier. La ligne entière ressemble à ceci.
Path=fy2tbaj8.default-1404984419419
Je veux imprimer uniquement les caractères après Path=
. J'ai essayé grep Path filename | head -5
. Mais cela ne fonctionne pas.Il montre toujours la ligne entière. Comment puis-je faire ceci?
vous pouvez utiliser la commande cut
à cette fin.
grep Path filename |cut -c6-
Ici, l'option -c6-
signifie que vous imprimez du 6ème au dernier caractère.
Vous pouvez utiliser grep
et juste grep
:
grep -oP "(?<=Path=).*" file
Explication :
De man grep
:
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
-P, --Perl-regexp
Interpret PATTERN as a Perl compatible regular expression (PCRE)
Le lookbehind(?<=Path=)
affirme qu'à la position actuelle dans la chaîne, ce qui précède, ce sont les caractères Path=
. Si l'assertion réussit, le moteur correspond au modèle de résolution.
Pour la syntaxe d'expression régulière Perl 5, lisez la page de manuel expressions régulières Perl .
La solution awk
est ce que je voudrais utiliser, mais un processus légèrement plus petit à lancer est sed
et il peut produire les mêmes résultats, mais en substituant la partie PATH = de la ligne par ""
, i.e.
sed -n 's/^Path=//p' file
Le -n
annule le comportement par défaut de sed
s de 'print all lines' (donc -n
= no print), et pour imprimer une ligne, nous ajoutons le caractère p
après la sous-structure. Seules les lignes où se produit la substitution seront imprimées.
Cela vous donne le comportement que vous avez demandé, de grep
ing pour une chaîne, mais en supprimant la partie Path=
de la ligne.
Si, selon les commentaires de David Foerster, vous avez un fichier volumineux et souhaitez arrêter le traitement dès que vous avez apparié et imprimé la première correspondance sur 'Path =', vous pouvez indiquer à sed de quitter, à l'aide de la commande q
. Notez que vous devez en faire un groupe de commandes en entourant à la fois { ..}
et en séparant chaque commande avec un ;
. Donc, la commande améliorée est
sed -n 's/^Path=//{p;q;}` file
IHTH
Avec GNU grep:
$ echo Path=fy2tbaj8.default-1404984419419 | grep -oP '(Path=)\K.*'
fy2tbaj8.default-1404984419419
\K
conserve le contenu de\K, ne l'incluez pas dans $&
.
grep
insère une ligne de texte et l'affiche. head
affiche les premières n lignes de texte, pas les caractères.
Vous recherchez sed
ou awk
:
awk '{print $2}' FS='='
Ceci définit =
en tant que séparateur de champ et imprime le deuxième champ.
Bien sûr, la solution consiste à utiliser grep -Po
.
Ajoutons d'autres solutions, par souci d'exhaustivité:
avec cut
, définissez le délimiteur sur =
:
cut -d'=' -f2 file
Cela peut être un peu risqué, mais vous pouvez aussi source le fichier, de sorte que $Path
contiendra la valeur.
source file
echo "$Path"
$ cat a
this=aaabbccc
that=dddeee
$ source a
$ echo "$this"
aaabbccc
$ echo "$that"
dddeee
Selon les commentaires, voyez comment source
ne constitue qu'une partie du fichier:
$ cat a
Path=22
Path=33
$ source a
$ echo $Path
33
$ source <(head -1 a)
$ echo $Path
22