2010-11-03 7 views
1

De extracting the values using grepextraction de la valeurs à l'aide-grep

Reading:RG1:+ /user/reading-2/Monday:12 
Reading:RG1:- /user/**/Friday:12 
Reading:RG1:- /user/**/*.txt:12 
Reading:RG1:- /user/tet-23/**/*.txt:12 
Reading:RG2:+ /user/reading-2/Monday:12 
Reading:RG2:- /user/**/Friday:12 
Reading:RG2:- /user/**/*.txt:12 
Reading:RG2:- /user/tet-23/**/*.txt:12 

J'ai essayé avec ceci: chat a.txt | grep RG1 | grep '-' | couper -d ':' -f3- | couper -D'- » -f2 | sed -e 's///'

Ce ne fonctionnera pas parce qu'il extraira mauvais chemin parce que certains de + aussi avoir -

Comment reslove cette question

+0

utilisation inutile de cat. Vous devriez omettre 'cat a.txt' et changer votre premier grep en' grep RG1 a.txt'. Cela ne résoudra pas votre problème mais il est plus efficace. – Sorpigal

Répondre

2

Essayez ceci:

egrep "^[^:]*:RG1:-" a.txt | cut -d: -f3 | cut -b3- 

run Exemple:

$ cat a.txt 
Reading:RG1:+ /user/reading-2/Monday:12 
Reading:RG1:- /user/**/Friday:12 
Reading:RG1:- /user/**/*.txt:12 
Reading:RG1:- /user/tet-23/**/*.txt:12 
Reading:RG2:- /user/tet-23/**/*.txt:12 
Reading:RG2:+ /user/reading-2/Monday:12 
$ egrep "^[^:]*:RG1:-" a.txt | cut -d: -f3 | cut -b3- 
/user/**/Friday 
/user/**/*.txt 
/user/tet-23/**/*.txt 

"^[^:]*:RG1:-" signifie « commencer par quoi que ce soit, mais : zéro fois ou plus, puis un :, puis un RG1, suivi par -.

+0

Je peut avoir besoin de rechercher uniquement RG1 alors ça ne marchera pas .. parce que j'ai RG2, RG3 dans les données ... – Tree

+0

alors: 'grep 'RG [0-9]: -' –

+0

(J'ai mis à jour ma réponse après avoir écrit le commentaire ci-dessus :-) – aioobe

1

Vous pouvez essayer d'obtenir la chaîne complète "RG1:+", puis coupé par l'espace, par exemple:

grep "RG1:+" a.txt | cut -d" " -f2 
1

Essayez avec sed

sed -r -e '/:RG1:/s/.*:[+-] //;s/:[0-9]+$//' a.txt 

qui fonctionnera uniquement sur les lignes avec :RG1: en eux. Vous pouvez généraliser ce pour toutes les lignes:

sed -r -e 's/.*:[+-] //;s/:[0-9]+$//' a.txt 

Ou seulement des lignes avec RG et un nombre

sed -r -e '/:RG[0-9]+:/s/.*:[+-] //;s/:[0-9]+$//' a.txt 

Si vous voulez garder la fuite: 12 omettent simplement la substitution finale, par exemple:

sed -r -e '/:RG[0-9]+:/s/.*:[+-] //' a.txt 
0

Si Perl est alowed
- ou +

perl -nE 'say $1 if /\AReading:RG[1-9]:[+-]\s+(.*)\Z/' file 

seulement -

perl -nE 'say $1 if /\AReading:RG[1-9]:-\s+(.*)\Z/' file 
0

Essayez cette variation sur la réponse que je donnais à votre question précédente:

grep -Po '(?<=RG1:-).*(?=:\d*$)' a.txt 
Questions connexes