awk / sed, um nur bis zum Unterstrich zu drucken


10

Wie kann ich awk oder sed verwenden, um eine Zeichenfolge nur bis zum ersten Unterstrich zu drucken?

Vor:

host100_044 2
host101_045 2
host102_046 2

Nach:

host100
host101
host102

Antworten:


20

Dies kann erfolgen mit cut:

cut -d _ -f 1

z.B

$ echo host100_044 2 | cut -d _ -f 1
host100

Auch mit awkkann getan werden awk -F_ '{print $1}'(wahrscheinlich gibt es einen saubereren Weg, das zu tun)


@Renan Wie ändere ich diese Schnittfunktion, wenn die Ausgabe zusätzlich zur Ausführung des Schnitts alle Eingabeinformationen enthalten soll?
BioMan

2

Eine weitere Alternative für sed:

echo 'host100_044 2' | sed 's/^\(.*\)_.*$/\1/'

Wenn Sie diese in einer Datei haben, können Sie sie wie folgt aufrufen:

cat fileName | sed 's/^\(.*\)_.*$/\1/'

1
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} {printf("host%s ", $1)}'  | cut -d ' ' -f2-

Ausgabe:

host100 host101 host102

Mit Zeilenumbrüchen:

echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} $1 ~ /[0-9]/ {print "host"$1}'

Ausgabe:

host100
host101
host102

1

Verwenden von sed:

echo host100_044 2 | sed 's;_.*;;'


Verwenden der sedBearbeitungsoption an Ort und Stelle,

sed -i.old 's;_.*;;' infile

Habe gerade das gleiche geschrieben, obwohl die awkLösung bereits gepostet ist (und cutin diesem Fall wahrscheinlich am besten ist), da er danach gefragt hat sed, aber du hast mich mit Sekunden geschlagen :-). Sie können das sogar entfernen $, da es .*standardmäßig mit dem Zeilenende übereinstimmt .
Daniel Andersson

@ DanielAndersson: Ja.
Prinz John Wesley

1
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100

Die -F'_'Anweisung awk, Unterstriche als Feldtrennzeichen zu verwenden. Das awkSkript selbst druckt nur das erste Feld.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.