Obtenez le contenu avant deux points

8

J'ai un fichier texte sur Linux dont le contenu est comme ci-dessous:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com

Je veux obtenir le contenu avant les deux points comme ci-dessous:

help.helloworld.com
dev.helloworld.com

Comment puis-je faire cela dans le terminal?

Gabrial Johnas
la source
2
L' greputilitaire est utilisé pour rechercher des lignes correspondant à des expressions régulières. Vous pouvez éventuellement l'utiliser ici, mais il serait plus approprié d'utiliser un outil qui extrait les données des champs en fonction d'un délimiteur, comme l' cututilitaire.
Kusalananda
J'ai soumis une modification pour supprimer le mot "grep" et le remplacer par "find" dans le titre et "get" dans le corps de la question, pour éviter le problème X / Y de supposer que grepc'est le bon outil pour résoudre le problème réel. problème.
Monty Harder
1
Tout ce que je peux dire, c'est que le contenu avant les deux points est bien meilleur que le contenu après les deux points ;-).
Peter - Rétablir Monica

Réponses:

35

C'est pour ça cut:

$ cat file
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
foo:baz:bar
foo

$ cut -d: -f1 file
help.helloworld.com
dev.helloworld.com
foo
foo

Vous venez de définir le délimiteur :avec -d:et lui dites de n'imprimer que le 1er champ ( -f1).

terdon
la source
19

Ou une alternative:

$ grep -o '^[^:]*' file
help.helloworld.com
dev.helloworld.com

Cela renvoie tous les caractères commençant au début de chaque ligne ( ^) qui ne sont pas des deux-points ( [^:]*).

Freddy
la source
18

Je recommanderais certainement awk:

awk -F ':' '{print $1}' file

Utilise :comme séparateur de champ et imprime le premier champ.

Centimane
la source
5

réponse mise à jour

Considérant le fichier suivant file.txt:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
no.colon.com
colon.at.the.end.com:

Vous pouvez utiliser sedpour tout supprimer après les deux points:

sed -e 's/:.*//' file.txt

Cela fonctionne pour tous les cas d'angle soulignés dans les commentaires - si cela se termine par deux points, ou s'il n'y a pas de deux points, bien que ceux-ci ne soient pas mentionnés dans la question elle-même. Merci à @Rakesh Sharma, @mirabilos et @Freddy pour leurs commentaires. Répondre aux questions est un excellent moyen d'apprendre.

Randy Josleyn
la source
4
sed -e 's/:.*//' file.txtest une autre façon avec Posix sed.
Rakesh Sharma
1
sed -ne 'y/:/\n/;P' file.txtpeut également être utilisé.
Rakesh Sharma
Make .+to.*
Rakesh Sharma
@Randy Joselyn Comme il y a une implicite ifdans la s///psyntaxe, vous devez modifier votre regex pour prendre soin de lignes sans côlons, quelque chose comme sed -nEe 's/([^:]*)(:.*|)/\1/p'. Notez que cela nécessite GNU sedmais puisque de toute façon vous êtes sur GNU sed donc cela ne devrait pas avoir d'importance.
Rakesh Sharma
Cette réponse aurait pu être ma préférée, mais les ERE ne sont pas nécessaires. sed -n '/:/s/^\([^:]*\):.*$/\1/p(ajouter --posixsi vous utilisez GNU sed, juste pour
contrarier
4

Nécessite GNU grep. Cela ne fonctionnerait pas avec le grep par défaut sur par exemple macOS ou l'un des autres BSD.

Voulez-vous dire comme ça:

grep -oP '.*(?=:)' file

Production:

help.helloworld.com
dev.helloworld.com
schrodigerscatcuriosity
la source
4
S'il y a deux ou deux points sur la ligne, cela imprimera tout jusqu'au dernier, donc pas ce dont l'OP a besoin. Essayez echo foo:bar:baz | grep -oP '.*(?=:)'. Cela fonctionnera pour l'exemple du PO, mais pas pour le cas général décrit dans la question.
terdon
il n'y a qu'un seul côlon et
ça
-1

Vous pouvez y parvenir avec la gestion des chaînes bash, en supprimant la correspondance la plus longue de la chaîne directement pour chaque ligne lue comme suit:

for line in $(cat inputfile); do echo "${line%%:*}"; done

Cela peut être une alternative utile si vous analysez le fichier dans un script shell (bien que je soupçonne que l'utilisation de cut soit plus efficace).

Jim Rippon
la source