Comment grep contenu d'après modèle?
Donné un fichier, par exemple:
potato: 1234
apple: 5678
potato: 5432
grape: 4567
banana: 5432
sushi: 56789
J'aimerais grep pour toutes les lignes qui commencent par potato:
mais seulement pipe les chiffres qui suivent potato:
. Ainsi, dans l'exemple ci-dessus, la sortie serait:
1234
5432
Comment puis-je le faire?
Vous devez vous connecter pour publier un commentaire.
ou
ou
ou
ou
ou
cut
! (Nous avons les poids légers de travail, aujourd'hui. Je vous dois +1 après l'00:00 UTC actualiser.)awk '$1 ~ /potato/ { print $2 }' file.txt
.awk '/potato:/ {print $2}'
perl -pe
Ou de l'utilisation de regex assertions:
grep -oP '(?<=potato: ).*' file.txt
-o
moyens d'imprimer uniquement la partie correspondant de la ligne. Alors que-P
déduit un Perl-compatible regular expression, qui se trouve être une positif lookbehind regex(?<=string)
.On peut penser Grep comme une restriction de l'Sed, ou de Sed comme un généralisées Grep. Dans ce cas, Sed est un outil léger qui fait ce que vous voulez, même si, bien sûr, il existe plusieurs autres façons raisonnables de le faire aussi.
sed
!Ce sera tout d'impression après chaque match, sur la même ligne:
Cela va faire la même chose, sauf qu'il sera également imprimer toutes les lignes suivantes:
Ces options de ligne de commande sont utilisés:
-n
boucle autour de chaque ligne du fichier d'entrée-l
supprime les retours à la ligne avant le traitement, et ajoute dans de retour après-e
exécuter le code perlVous pouvez utiliser grep, comme les autres réponses de l'état. Mais vous n'avez pas besoin de grep, awk, sed, perl, couper, ou de tout outil externe. Vous pouvez le faire par pur bash.
Essayez ceci (les points-virgules sont là pour vous permettre de tout mettre sur une seule ligne):
## indique bash pour supprimer le plus long match de ": "dans $ligne à partir de l'avant.
ou si vous avez la clé plutôt que de la valeur, %% dit bash pour supprimer le plus long match de ": "dans $ligne à partir de la fin.
La sous-chaîne à split est:": \ " parce que l'espace de caractères doivent être échappés avec la barre oblique inverse.
Vous pouvez trouver plus comme ceux-ci à le projet de documentation linux.
while read
est extrêmement lente; à l'aide d'un utilitaire externe sera effectivement beaucoup plus rapide aussi longtemps que vous choisissez-en une avec tampon d'e/S (c'est à dire pratiquement n'importe quel de ceux mentionnés dans cette réponse, et beaucoup d'autres).read -r
sauf si vous êtes très demandant spécifiquement certains plutôt embêtants comportement hérité d'avant POSIX.