comment faire pour extraire la sous-chaîne de caractères et de chiffres seulement à l'aide de grep/sed
J'ai un fichier texte contenant à la fois du texte et des chiffres, je veux utiliser grep pour extraire uniquement les chiffres que j'ai besoin par exemple, étant donné un fichier comme suit:
miss rate 0.21
ipc 222
stalls n shdmem 112
Donc dire que je ne veux extraire les données pour miss rate
qui est 0.21
. Comment puis-je faire avec grep ou sed? De Plus, j'ai besoin de plus d'un certain nombre, non seulement l'un après l' miss rate
. C'est, je voudrez peut-être obtenir deux 0.21
et 112
. Un exemple de sortie pourrait ressembler à ceci:
0.21 222 112
Cause j'ai besoin de données pour plus tard parcelle.
- Je recommande d'utiliser sed au lieu de grep si cela fonctionne pour vous
- sed est également acceptable si elle fonctionne de manière plus élégante dans ce cas.
Vous devez vous connecter pour publier un commentaire.
Utilisation
awk
à la place:De le faire avec juste grep, vous devez les extensions non standard comme ici avec GNU grep à l'aide de PCRE (-P) avec positifs lookbehind (?<=..) et correspondent uniquement (-o):
À l'aide de la regardez autour de regex truc \K avec pcre moteur grep :
ou avec perl :
La
grep
-et-cut
solution serait:à la 3ème champ pour chaque grep utiliser:
ou pour obtenir le 3ème et le reste l'utilisation de:
Ou si vous utilisez bash et "miss taux" ne se produit qu'une fois dans votre fichier vous pouvez aussi simplement faire:
où
${a[2]}
est votre résultat.Si "miss taux de" se produit plus d'une fois, vous pouvez passer en boucle la commande grep sortie lire uniquement ce dont vous avez besoin. (en bash)
Si vous vraiment souhaitez utiliser grep pour cela, vous pouvez essayer:
Il sera le premier à trouver la ligne qui correspond à, et ensuite seulement de la sortie des chiffres.
Sed peut-être un peu plus lisible, si:
Vous pouvez utiliser:
ou:
À la fois de ces commandes permet d'imprimer
miss rate 0.21
. Si vous voulez extraire le numéro seulement, pourquoi ne pas utiliser Perl, Sed ou Awk?Si vous voulez vraiment éviter de ceux, peut-être que cela va fonctionner?
Je crois
sed 's|[^0-9]*\([0-9\.]*\)|\1 |g' fiilename
fera l'affaire. Cependant chaque entrée sera sur sa propre ligne si c'est ok. Je suis sûr qu'il y est un moyen pour les sed pour produire une virgule ou un espace délimité de la liste, mais je ne suis pas un super maître de toutes choses sed.