Comme vous le dites dans votre question, awk
c'est vraiment la voie à suivre. Utiliser cut
est possible avec tr -s
pour serrer les espaces, comme le montre la réponse de kev .
Permettez-moi cependant de passer en revue toutes les combinaisons possibles pour les futurs lecteurs. Les explications se trouvent dans la section Test.
tr | Couper
tr -s ' ' < file | cut -d' ' -f4
awk
awk '{print $4}' file
frapper
while read -r _ _ _ myfield _
do
echo "forth field: $myfield"
done < file
sed
sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file
Les tests
Compte tenu de ce fichier, testons les commandes:
$ 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 | Couper
$ 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
frapper
Cela lit les champs de manière séquentielle. En utilisant, _
nous indiquons qu'il s'agit d'une variable jetable en tant que "variable indésirable" pour ignorer ces champs. De cette façon, nous stockons en $myfield
tant que 4ème champ dans le fichier, peu importe les espaces entre eux.
$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4
sed
Cela attrape trois groupes d'espaces et aucun espace avec ([^ ]*[ ]*){3}
. Ensuite, il attrape tout ce qui arrive jusqu'à un espace comme le 4ème champ, avec lequel il est finalement imprimé \1
.
$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4