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
Rubstr
quelle

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
quelle
@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/'
scriptmonster
quelle
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
jftuga
quelle
1

Verwenden von sed:

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


Verwenden der sedBearbeitungsoption an Ort und Stelle,

sed -i.old 's;_.*;;' infile
Prinz John Wesley
quelle
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.

Sergey Fadeev
quelle
0

Dadurch wird die Ausgabe vor _:

sed 's/_.*//' -filename

y.kashyap007
quelle