Ich brauche Hilfe, um herauszufinden, wie der Befehl sed verwendet wird, um nur die erste und die letzte Spalte in einer Textdatei anzuzeigen. Folgendes habe ich bisher für Spalte 1:
cat logfile | sed 's/\|/ /'|awk '{print $1}'
Mein schwacher Versuch, die letzte Spalte auch zu zeigen, war:
cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'
Dabei werden jedoch die erste und die letzte Spalte in einer Liste zusammengefasst. Gibt es eine Möglichkeit, die erste und die letzte Spalte mit sed- und awk-Befehlen deutlich auszudrucken?
Beispieleingabe:
foo|dog|cat|mouse|lion|ox|tiger|bar
Antworten:
Fast dort. Stellen Sie einfach beide Spaltenverweise nebeneinander.
Beachten Sie auch, dass Sie
cat
hier nicht brauchen .Beachten Sie auch,
awk
dass die Spaltentrennzeichen|
keine Leerzeichen sind, sodass Sie auch keine benötigensed
.Nach den Vorschlägen von Caleb können Sie eine Lösung verwenden, die auch dann das letzte Feld ausgibt, wenn es nicht genau acht gibt
$NF
.Wenn Sie möchten, dass die Ausgabe die
|
Trennzeichen beibehält, anstatt ein Leerzeichen zu verwenden, können Sie auch die Trennzeichen für die Ausgabefelder angeben. Leider ist es etwas umständlicher als nur die-F
Flagge zu benutzen , aber hier sind drei Ansätze.Sie können die Trennzeichen für Ein- und Ausgabefelder
awk
im BEGIN-Block selbst zuweisen .Sie können diese Variablen beim Aufruf
awk
von der Kommandozeile über das-v
Flag zuweisen .oder einfach:
quelle
|
anstelle des Standardbereichs für die Zeichenfolgenverkettung einen Hinweis zur Verwendung als Ausgabetrennzeichen hinzu. Sie könnten auch erklären, dass Sie$NF
anstelle der festen Codierung verwenden$8
, um die letzte Spalte zu erhalten.Ersetzen Sie einfach vom ersten bis zum letzten
|
durch ein|
(oder ein Leerzeichen, wenn Sie es vorziehen):Beachten Sie, dass es zwar keine spezielle
sed
Implementierung|
gibt (solange über oder in einigen Implementierungen keine erweiterten regulären Ausdrücke aktiviert sind ), in einigen Fällen jedoch eine besondere Implementierung vorliegt, z . B. in GNU . Also solltest du nicht-E
-r
\|
sed
entkommen,|
wenn Sie beabsichtigen, dass es mit dem|
Charakter übereinstimmt .Wenn Sie durch Leerzeichen ersetzen und die Eingabe möglicherweise bereits Zeilen mit nur einem enthält
|
, müssen Sie dies als besonders behandeln|.*|
es bei diesen nicht übereinstimmt. Das könnte sein:(das ist machen die
.*|
Teil optional) Oder:oder:
Wenn Sie das erste und das achte Feld unabhängig von der Anzahl der Felder in der Eingabe wünschen, dann ist es nur:
(Alle funktionieren mit jedem POSIX - kompatiblen Dienstprogramm, vorausgesetzt, die Eingabe bildet gültigen Text. (Insbesondere
sed
funktionieren diese im Allgemeinen nicht, wenn die Eingabe Bytes oder Folgen von Bytes enthält, die im aktuellen Gebietsschema keine gültigen Zeichen bilden, wie zum Beispielprintf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'
in ein UTF-8-Gebietsschema)).quelle
Sie verwenden
awk
sowieso:quelle
|
eher das Leerzeichen zu sein scheint ) mit-F\|
oder ähnlich angeben ? Was ist auch, wenn er das gleiche Trennzeichen für die Ausgabe verwenden möchte?Wenn Sie sich ohne Probleme und ohne Sedimente fühlen, können Sie dasselbe mit coreutils erreichen:
quelle
cut
ist sauberer und kompakter als awk / sed, wenn Sie nur an der ersten Spalte interessiert sind oder wenn die Begrenzungslinien festgelegt sind (dh keine variable Anzahl von Leerzeichen).Es sieht so aus, als ob Sie versuchen, das erste und das letzte Textfeld abzurufen, die durch begrenzt sind
|
.Ich bin davon ausgegangen, dass Ihre Protokolldatei den folgenden Text enthält:
Und Sie möchten die Ausgabe wie folgt:
Wenn ja, dann kommt hier der Befehl für Ihre
Durch GNU sed,
Beispiel:
quelle
Sie sollten es wahrscheinlich mit
sed
- ich würde es sowieso tun - aber nur weil noch niemand dieses geschrieben hat:AUSGABE
quelle