Wie Sie in Ihrer Frage kommentieren, awk
ist wirklich der richtige Weg. Die Verwendung cut
ist zusammen mit tr -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
tr -s ' ' < file | cut -d' ' -f4
awk
awk '{print $4}' file
Bash
while read -r _ _ _ myfield _
do
echo "forth field: $myfield"
done < file
sed
sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file
Tests
Testen wir anhand dieser Datei die folgenden Befehle:
$ cat a
this is line 1 more text
this is line 2 more text
this is line 3 more text
this is line 4 more text
tr | Schnitt
$ cut -d' ' -f4 a
is
# it does not show what we want!
$ tr -s ' ' < a | cut -d' ' -f4
1
2 # this makes it!
3
4
$
awk
$ awk '{print $4}' a
1
2
3
4
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.
$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4
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
.
$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4