web-dev-qa-db-fra.com

Comment ordonner à grep de ne pas afficher la chaîne recherchée?

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?

8
Anandu M Das

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.

12
g_p

Vous pouvez utiliser grep et juste grep:

grep -oP "(?<=Path=).*" file

enter image description here

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 .

31
Sylvain Pineau

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 seds 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 greping 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

6
shellter

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 $&.

5
cuonglm

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.

5
Jan

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"
    

Tester

$ 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
1
fedorqui