Ottieni contenuti prima di due punti


8

Ho un file di testo su Linux in cui i contenuti sono come di seguito:

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

Voglio ottenere i contenuti prima dei due punti come di seguito:

help.helloworld.com
dev.helloworld.com

Come posso farlo all'interno del terminale?


2
L' greputilità viene utilizzata per cercare le linee che corrispondono alle espressioni regolari. È possibile utilizzarlo qui, ma sarebbe più appropriato utilizzare uno strumento che estrae i dati dai campi dati un delimitatore, come l' cututilità.
Kusalananda

Ho inviato una modifica per eliminare la parola "grep" e sostituirla con "trova" nel titolo e "ottenere" nel corpo della domanda, per evitare che il problema X / Y di assumere grepsia lo strumento giusto per risolvere l'effettivo problema.
Monty Harder,

1
Tutto quello che posso dire è che il contenuto prima del colon è molto meglio del contenuto dopo il colon ;-).
Peter - Ripristina Monica il

Risposte:


35

Questo è ciò che cutserve per:

$ 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

Basta impostare il delimitatore su :con -d:e dirgli di stampare solo il 1 ° campo ( -f1).


19

O un'alternativa:

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

Ciò restituisce tutti i caratteri che iniziano all'inizio di ogni riga ( ^) che non sono due punti ( [^:]*).


18

Consiglio vivamente awk:

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

Utilizza :come separatore di campo e stampa il primo campo.


5

risposta aggiornata

Considerando il seguente file file.txt:

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

Puoi usare sedper rimuovere tutto dopo i due punti:

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

Questo funziona per tutti i casi angolari evidenziati nei commenti, se termina in due punti o se non ci sono due punti, anche se questi non sono stati menzionati nella domanda stessa. Grazie a @Rakesh Sharma, @mirabilos e @Freddy per i loro commenti. Rispondere alle domande è un ottimo modo per imparare.


4
sed -e 's/:.*//' file.txtè un altro modo con Posix sed.
Rakesh Sharma,

1
sed -ne 'y/:/\n/;P' file.txtpuò anche essere usato.
Rakesh Sharma,

Make .+to.*
Rakesh Sharma,

@Randy Joselyn Dal momento che c'è una implicita ifnella s///psintassi, devi modificare la tua regex per occuparti delle linee senza due punti, qualcosa del genere sed -nEe 's/([^:]*)(:.*|)/\1/p'. Nota che questo richiede GNU sedma dato che comunque sei su GNU sed, quindi non dovrebbe importare.
Rakesh Sharma,

Questa risposta avrebbe potuto essere la mia preferita, ma le ERE non sono necessarie. sed -n '/:/s/^\([^:]*\):.*$/\1/p(aggiungi --posixse usi GNU sed, solo per
disputare

4

Richiede GNU grep. Non funzionerebbe con il grep predefinito, ad es. MacOS o uno qualsiasi degli altri BSD.

Intendi in questo modo:

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

Produzione:

help.helloworld.com
dev.helloworld.com

4
Se ci sono due o più due punti sulla linea, questo stamperà tutto fino all'ultimo, quindi non ciò di cui ha bisogno l'OP. Prova echo foo:bar:baz | grep -oP '.*(?=:)'. Questo funzionerà per l'esempio del PO, ma non per il caso generale come descritto nella domanda.
terdon

c'è solo un colon e funziona bene, ma grazie per l'aggiornamento
Gabrial Johnas,

-1

Puoi farlo con la gestione della stringa bash, rimuovendo la corrispondenza più lunga dalla stringa direttamente per ogni riga letta in questo modo:

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

Questa potrebbe essere un'alternativa utile se stai analizzando il file in uno script di shell (anche se sospetto che l'uso di cut potrebbe essere più efficiente).



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.