J'ai une commande, par exemple: echo "word1 word2"
. Je veux mettre un tube ( |
) et obtenir mot1 de la commande.
echo "word1 word2" | ....
Je ne sais pas quoi mettre après la pipe.
Awk est une bonne option si vous devez gérer des espaces blancs de fin, car il s'en chargera pour vous:
echo " word1 word2 " | awk '{print $1;}' # Prints "word1"
Cut ne s'en chargera pas:
echo " word1 word2 " | cut -f 1 -d " " # Prints nothing/whitespace
«couper» ici n'imprime rien / espace, car la première chose avant un espace était un autre espace.
-F","
pour remplacer le séparateur de champ par défaut (un espace) par une virgule.pas besoin d'utiliser des commandes externes. Bash lui-même peut faire le travail. En supposant que "mot1 mot2" vous avez obtenu de quelque part et stocké dans une variable, par exemple
maintenant vous pouvez assigner $ 1, ou $ 2 etc à une autre variable si vous le souhaitez.
la source
stdin
. @Matt M.--
signifiestdin
, ainsi$string
est transmis commestdin
.stdin
est des espaces séparés en arguments$1
,$2
,$3
, etc. - comme quand un argument de Évalue du programme Bash (chèques$1
,$2
etc.), cette approche profite de la tendance à diviser la du shellstdin
dans les arguments automatiquement, supprimant la nécessitéawk
oucut
.set
définit les arguments du shell.word1=$(IFS=" " ; set -- $string ; echo $1)
Réglez IFS pour reconnaître correctement l'espace entre les mots. Mettez entre parenthèses pour éviter d'écraser le contenu original de 1 $.string="*"
. Surprise.Je pense qu'un moyen efficace est l'utilisation de tableaux bash:
En outre, vous pouvez lire directement les tableaux dans un pipe-line:
la source
echo " word1 word2 " | { read -a array ; echo ${array[0]} ; }
string="*"
. Surprise.while
syntaxe pour récupérer chaque premier mot à chaque ligne. Sinon, utilisez l'approche Boontawee Home. Veuillez également noter que celaecho "${array[0]}"
a été cité pour empêcher l'expansion comme l'a remarqué gniourf-gniourf.Cela présente l'avantage de ne pas utiliser de commandes externes et de laisser intactes les variables $ 1, $ 2, etc.
la source
$1, $2, …
intactes est une fonctionnalité extrêmement utile pour l'écriture de scripts!Si vous êtes sûr qu'il n'y a pas d'espaces de début, vous pouvez utiliser la substitution de paramètre bash:
Attention à ne pas vous échapper de l'espace unique. Voir ici pour plus d'exemples de modèles de substitution. Si vous avez bash> 3.0, vous pouvez également utiliser la correspondance d'expressions régulières pour gérer les espaces de début - voir ici :
la source
Tu pourrais essayer awk
Avec awk, il est vraiment facile de choisir le mot que vous aimez (1 $, 2 $, ...)
la source
Utilisation de l'expansion des paramètres du shell
%% *
Voici une autre solution utilisant l' expansion des paramètres du shell . Il prend en charge plusieurs espaces après le premier mot. La gestion des espaces devant le premier mot nécessite une extension supplémentaire.
Explication
Le
%%
signifie la suppression de la plus longue correspondance possible de*
(un espace suivi d'un nombre quelconque de tout autre caractère) dans la partie de fin destring
.la source
Je me suis demandé comment plusieurs des meilleures réponses se mesuraient en termes de vitesse. J'ai testé ce qui suit:
1 @ mattbh's
2 @ ghostdog74's
3 @ boontawee-home's
et 4 @ boontawee-home
Je les ai mesurés avec le temps de Python dans un script Bash dans un terminal Zsh sur macOS, en utilisant une chaîne de test avec 215 mots de 5 lettres. A fait chaque mesure cinq fois (les résultats étaient tous pour 100 boucles, le meilleur de 3) et a fait la moyenne des résultats:
Bon travail, électeurs 👏 Les votes (au moment de la rédaction de cet article) correspondent à la vitesse des solutions!
la source
read -a
n'est pas valide dans le tiret)cut coupe le 1er champ (-f 1) d'une liste de champs délimités par la chaîne "" (-d "")
la source
read
est votre ami:Si la chaîne est dans une variable:
Si vous travaillez dans un tuyau: premier cas: vous ne voulez que le premier mot de la première ligne:
deuxième cas: vous voulez le premier mot de chaque ligne:
Ceux-ci fonctionnent s'il y a des espaces de tête:
la source
Comme perl incorpore la fonctionnalité de awk, cela peut également être résolu avec perl:
la source
Je travaillais avec un périphérique embarqué qui n'avait ni perl, awk ou python et je l'ai fait avec sed à la place. Il prend en charge plusieurs espaces avant le premier mot (que les solutions
cut
etbash
n'ont pas géré).Cela a été très utile lors de la recherche
ps
des ID de processus, car les autres solutions utilisant uniquement bash n'étaient pas en mesure de supprimer les premiers espacesps
utilisés pour l'alignement.la source