Ich versuche, ein bestimmtes (viertes) Feld aus dem spaltenbasierten, an das Leerzeichen angepassten Textstrom zu extrahieren. Ich versuche, den cut
Befehl folgendermaßen zu verwenden:
cat text.txt | cut -d " " -f 4
Behandelt leider cut
nicht mehrere Leerzeichen als ein Trennzeichen. Ich hätte durch awk pfeifen können
awk '{ printf $4; }'
oder sed
sed -E "s/[[:space:]]+/ /g"
um die Leerzeichen zu kollabieren, aber ich würde gerne wissen, ob es eine Möglichkeit gibt, mit cut
und mehreren Begrenzern nativ umzugehen ?
Antworten:
Versuchen:
Von der
tr
Manpage:quelle
cat
hier. Sie könnten< text.txt
direkt an übergebentr
. en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat-d
und direkt von mehreren Zeichen auf die Registerkarte übersetzen. Zum Beispiel: Ich bin hierher gekommen, um nach einer Möglichkeit zu suchen, meine Anzeige automatisch zu exportieren:who am i | tr -s ' ()' '\t' | cut -f5
echo "a b c" | cut -d " " -f2-
,echo "a b c" | tr -s " " | cut -d " " -f2-
Wie Sie in Ihrer Frage kommentieren,
awk
ist wirklich der richtige Weg. Die Verwendungcut
ist zusammen mittr -s
dem Drücken von Leerzeichen möglich, wie die Antwort von kev zeigt.Lassen Sie mich jedoch alle möglichen Kombinationen für zukünftige Leser durchgehen. Erläuterungen finden Sie im Abschnitt Test.
tr | Schnitt
awk
Bash
sed
Tests
Testen wir anhand dieser Datei die folgenden Befehle:
tr | Schnitt
awk
Bash
Dies liest die Felder nacheinander. Durch die Verwendung geben
_
wir an, dass dies eine Wegwerfvariable als "Junk-Variable" ist, um diese Felder zu ignorieren. Auf diese Weise speichern wir$myfield
als 4. Feld in der Datei, unabhängig von den Leerzeichen dazwischen.sed
Dies fängt drei Gruppen von Räumen und keine Räume mit
([^ ]*[ ]*){3}
. Dann fängt es alles ein, was kommt, bis ein Leerzeichen als 4. Feld, mit dem es schließlich gedruckt wird\1
.quelle
awk
ist nicht nur elegant und einfach, sondern auch in VMware ESXi enthalten, wotr
es fehlt.awk
!read
Befehl verwendet werden, wenn es uns egal ist, was darin enthalten ist . Es kann alles sein, es ist nur so, dass es irgendwie zum Standard wurdejunk_var
oderwhatever
:)kürzeste / freundlichste Lösung
Nachdem
cut
ich mit den zu vielen Einschränkungen von frustriert war , schrieb ich meinen eigenen Ersatz, den ich alscuts
"Schnitt gegen Steroide" bezeichnete.Schnitte bieten die wahrscheinlich minimalistischste Lösung für dieses und viele andere damit verbundene Probleme beim Ausschneiden / Einfügen.
Ein Beispiel von vielen, das sich mit dieser speziellen Frage befasst:
cuts
unterstützt:paste
separater Aufruf erforderlich )und vieles mehr. Keines davon ist standardmäßig vorgesehen
cut
.Siehe auch: https://stackoverflow.com/a/24543231/1296044
Quelle und Dokumentation (freie Software): http://arielf.github.io/cuts/
quelle
Dieser Perl-Einzeiler zeigt, wie eng Perl mit awk verwandt ist:
Das
@F
Autosplit-Array beginnt jedoch am Index,$F[0]
während awk-Felder mit beginnen$1
quelle
Mit Versionen von
cut
, von denen ich weiß, nein, das ist nicht möglich.cut
Dies ist in erster Linie nützlich, um Dateien zu analysieren, bei denen das Trennzeichen kein Leerzeichen ist (z. B./etc/passwd
) und die eine feste Anzahl von Feldern haben. Zwei Trennzeichen in einer Reihe bedeuten ein leeres Feld, und das gilt auch für Leerzeichen.quelle