utiliser l'espace comme délimiteur avec la commande cut
8 réponses
cut -d ' ' -f 2
où 2 est le numéro de champ du champ délimité par l'espace que vous voulez.
habituellement si vous utilisez l'espace comme délimiteur, vous voulez traiter plusieurs espaces comme un, parce que vous analysez la sortie d'une commande alignant certaines colonnes avec des espaces. (et la recherche google qui m'a conduit ici)
dans ce cas, une seule commande cut
n'est pas suffisante, et vous devez utiliser:
tr -s ' ' | cut -d ' ' -f 2
ou
awk '{print }'
vous pouvez aussi dire
cut -d\ -f 2
notez qu'il y a deux espaces après le backslash.
pour compléter les réponses existantes, utiles; pointe du chapeau à QZ Support pour m'encourager à poster une réponse séparée:
deux mécanismes distincts entrent en jeu ici:
-
(a) Si
cut
lui-même exige que le délimiteur (l'espace, dans ce cas) passé à l'option-d
soit argument distinct ou s'il est acceptable de l'ajouter directement à-d
. -
b) comment le shell analyse généralement les arguments avant de les passer à la commande invoquée.
(un) est répondu par une citation de la POSIX lignes directrices pour les services publics (l'emphase est mienne)
si le SYNOPSIS d'un utilitaire standard montre une option avec une option obligatoire option-argument [...] une demande conforme doit utiliser séparé arguments pour cette option et son option-argument . Toutefois , conforme mise en œuvre est aussi les demandes de permis de spécifier l'option et l'option-argument dans la même chaîne d'argument sans caractères intermédiaires .
en d'autres termes: dans ce cas, parce que -d
's option-argument est obligatoire , vous pouvez choisir si de spécifier le délimiteur comme :
- (s) soit: a séparé argument
- (d) OU: comme une valeur directement attaché à
-d
.
une Fois que vous avez choisi (s) ou (d), c'est le shell chaîne littérale d'analyse (b) que les questions:
-
avec approche (s) , toutes les formes suivantes sont équivalentes:
-
-d ' '
-
-d " "
-
-d \<space> # <space> used to represent an actual space for technical reasons
-
-
avec approche (d) , tous les formulaires suivants sont équivalents:
-
-d' '
-
-d" "
-
"-d "
-
'-d '
-
d\<space>
-
L'équivalence est expliqué par le shell chaîne littérale de traitement:
toutes les solutions ci-dessus donnent le même chaîne exacte (dans chaque groupe) au moment où cut
les voit :
-
(s) :
cut
voit-d
, comme son propre argument, suivi d'un séparé argument qui contient un espace char - sans guillemets ou\
préfixe!. -
(d) :
cut
voit-d
plus un espace char - sans les guillemets ou\
préfixe! - dans le cadre de l'argument même .
la raison pour laquelle le les formes dans leurs groupes respectifs, sont finalement identique est double, basé sur comment shell analyse littéraux de chaîne :
- l'enveloppe permet de spécifier littéralement comme par un mécanisme appelé citant , qui peut prendre plusieurs formes :
- "1519380920 d'une" cité chaînes: le contenu à l'intérieur
'...'
est prise , littéralement et les formes unique argument - entre guillemets chaînes: le contenu à l'intérieur
"..."
est aussi un unique argument, mais est sujet à des interpolation (élargit les références à des variables telles que la$var
, commande de substitutions ($(...)
ou`...`
), ou les expansions arithmétiques ($(( ... ))
). -
\
-une citation de individual caractères : un\
précédant un caractère unique fait que ce caractère est interprété comme un littéral.
- "1519380920 d'une" cité chaînes: le contenu à l'intérieur
- citation est complétée par suppression de citation , ce qui signifie qu'une fois le réservoir a parsé une ligne de commande, il supprime les caractères de citation des arguments (entourant
'...'
ou"..."
ou\
instances) - ainsi, la commande étant invoquée ne voit jamais les caractères de citation .
I vient de découvrir que vous pouvez également utiliser "-d "
:
cut "-d "
Test
$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am
scut , un utilitaire de coupe (plus intelligent mais plus lent que j'ai fait) qui peut utiliser n'importe quel regex perl comme jeton de rupture. Casser sur les espaces est la valeur par défaut, mais vous pouvez aussi casser sur les regexes multi-char, les regexes alternatifs, etc.
scut -f='6 2 8 7' < input.file > output.file
ainsi la commande ci-dessus casserait les colonnes sur les espaces et extrairait les colonnes (basées sur 0) 6 2 8 7 dans cet ordre.
vous ne pouvez pas le faire facilement avec cut si les données ont par exemple plusieurs espaces. J'ai trouvé utile de normaliser d'entrée pour faciliter son traitement. Un truc est d'utiliser sed pour la normalisation comme ci-dessous.
echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2 #bar
j'ai une réponse (j'admets une réponse quelque peu confuse) qui implique sed
, expressions régulières et groupes de saisie:
-
\S*
- premier mot -
\s*
- délimiteur -
(\S*)
- second mot-capturé -
.*
- reste de la ligne
comme expression sed
, le groupe de capture doit être \(
et \)
.
le renvoie une copie du groupe capturé, c'est-à-dire le second mot.
$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*//'
beta
Quand vous regardez cette réponse, un peu confus, et, vous pensez peut-être, pourquoi s'embêter? Eh bien, j'espère que certains, peut aller "Aha!"et d'utiliser ce modèle pour résoudre certains complexes d'extraction de texte à des problèmes avec un seul sed
expression.