Je voudrais obtenir la dernière colonne de cet exemple:
[ 3] 1.0- 2.0 sec 1.00 MBytes 8.39 Mbits/sec
[ 3] 2.0- 3.0 sec 768 KBytes 6.29 Mbits/sec
[ 3] 3.0- 4.0 sec 512 KBytes 4.19 Mbits/sec
[ 3] 4.0- 5.0 sec 256 KBytes 2.10 Mbits/sec
...
Si j'utilise
cut -d\ -f 13
Je reçois
Mbits/sec
6.29
4.19
2.10
car parfois il y a des espaces supplémentaires entre les deux.
text-processing
columns
cut
rubo77
la source
la source
Mbits/sec
, c'est ce que vous voulez ou les 2 dernières colonnes?Réponses:
Pour répondre à votre question littéralement:
ou
Mais cela ne fonctionnera pas si le nombre entre parenthèses atteint 10, etc. Si vous êtes uniquement intéressé par les nombres, vous pouvez supprimer tout le reste.
la source
| sed 's/ .*//'
à la fin des deux premiers exemples. Bien sûr, il existe de nombreuses autres façons de le faire.+
au lieu de*
: cat test | sed 's / [^. 0-9] \ + /: / g' | cut -d: -f 6+
et?
dans ERE mais laisse\+
et\?
dans BRE non défini.Si nous utilisons la
tr
commande avec l' option squeeze (-s
indicateur) pour convertir tous les espaces consécutifs multiples en un seul espace, puis effectuer unecut
opération avec l'espace comme délimiteur - nous pouvons accéder à la colonne requise portant les nombres.Reportez-vous au code ci-dessous:
cat file | tr -s ' ' | cut -d ' ' -f 8
la source
Ces commandes imprimeront toutes la dernière colonne d'un fichier séparé par des espaces:
awk '{print $NF}' file
dans
awk
,NF
est le nombre de champs et$NF
est le dernier champ.perl -lane 'print $F[$#F]' file
-a
divise le fichier sur les espaces en tableau@F
,$#F
est le nombre d'éléments dans le tableau, tout$F[$#F]
comme le dernier élément. Les-n
moyens lisent le fichier donné sur la ligne de commande et appliquent le script transmis-e
à chaque ligne.-l
ajoute simplement un caractère de nouvelle ligne (\n
) à chaqueprint
instruction.sed 's/.* //g'
une expression régulière simple qui fait correspondre tout au dernier espace et le supprime, ne laissant que la dernière colonne.
rev file | cut -d' ' -f 1 | rev
rev
inverse sa sortie pour que le dernier champ soit le premier,cut
avec un espace de délimitation pour l'imprimer etrev
pour ramener le texte à la normale. Cela ne fonctionnera pas si vous avez des espaces consécutifs .Sur la base de votre contribution, je suppose que vous ne voulez pas réellement la dernière colonne mais l'avant-dernière ou les deux dernières. Dans ce cas, utilisez-les pour imprimer les 2 derniers (
8.39 Mbits/sec
):et ceux-ci pour imprimer l'avant-dernier (
8.39
):la source
Vous ne pouvez pas séparer plusieurs occurrences d'espaces en utilisant
cut
le manuel:sauf si le texte est séparé par le même montant ou que vous utilisez
tr
pour en supprimer l'excès.Sinon, utilisez des outils alternatifs tels que
awk
,sed
ouex
.Par exemple:
Remplacez
+q!
par-cwq
pour enregistrer les modifications sur place.la source
Utilisez un perl one-liner comme ceci:
perl -lane 'print $F[-2]' input_file
Explication:
L'option
-e
oblige l'interpréteur perl à rechercher le script en ligne, plutôt que dans un fichier.L'option
-n
fait que l'entrée (fichier ou STDIN d'un tube) est lue ligne par ligne.L'option
-l
supprime le séparateur d'enregistrement d'entrée (dépendant du système d'exploitation, saut de ligne sur UNIX par défaut) après avoir lu la ligne et l'ajoute à la fin à chaqueprint
L'option
-a
entraîne la division de chaque ligne d'entrée sur les espaces en tableau@F
, et$F[-2]
est le deuxième élément comptant à partir de la fin, qui est le champ souhaité. Vous pouvez également utiliser$F[$#F-1]
, où$#F
est le dernier index du tableau@F
, qui est légèrement moins lisible.la source