Disons que pendant votre journée de travail, vous rencontrez à plusieurs reprises la forme suivante de sortie en colonnes à partir d'une commande dans bash (dans mon cas, lors de l'exécution svn st
dans mon répertoire de travail Rails):
? changes.patch
M app/models/superman.rb
A app/models/superwoman.rb
afin de travailler avec la sortie de votre commande - dans ce cas, les noms de fichiers - une sorte d'analyse est nécessaire pour que la deuxième colonne puisse être utilisée comme entrée pour la commande suivante.
Ce que j'ai fait est d'utiliser awk
pour accéder à la deuxième colonne, par exemple lorsque je veux supprimer tous les fichiers (pas que ce soit un cas d'utilisation typique :), je ferais:
svn st | awk '{print $2}' | xargs rm
Puisque je tape souvent ceci, une question naturelle est: y a-t-il un moyen plus court (donc plus cool) d'accomplir cela dans bash?
REMARQUE: Ce que je demande est essentiellement une question de commande shell même si mon exemple concret est sur mon flux de travail svn. Si vous pensez que le flux de travail est idiot et que vous suggérez une approche alternative, je ne vous voterai probablement pas, mais d'autres pourraient le faire, car la question ici est vraiment de savoir comment obtenir la sortie de la commande de la n-ième colonne dans bash, de la manière la plus courte possible . Merci :)
Réponses:
Vous pouvez utiliser
cut
pour accéder au deuxième champ:Edit: Désolé, je n'ai pas réalisé que SVN n'utilise pas d'onglets dans sa sortie, donc c'est un peu inutile. Vous pouvez personnaliser
cut
la sortie, mais c'est un peu fragile - quelque chose commecut -c 10-
cela fonctionnerait, mais la valeur exacte dépendra de votre configuration.Une autre option est quelque chose comme:
sed 's/.\s\+//'
la source
cut -f2
avec lasvn st
sortie. Vous verrez que cela ne fonctionne pas.svn st
utiliserait des onglets dans sa sortie. Après quelques tests, il semble que ce ne soit pas le cas. Zut.-d
permettre à cela de fonctionner.cut -d" " -f2
.Pour accomplir la même chose que:
en utilisant uniquement bash, vous pouvez utiliser:
Certes, ce n'est pas plus court, mais c'est un peu plus efficace et il gère correctement les espaces dans vos noms de fichiers.
la source
a
etb
comment les obtenir?a
représente la première colonne etb
représente les colonnes restantes. Si vous souhaitez imprimer la deuxième colonne, utilisezread a b c;
puis utilisez à laecho
place derm
. J'ai utilisé cela pour obtenir un tas de processus d'identifiants qui suivaient un modèle grep, afin que je puisse tous les interrompre.Je me suis retrouvé dans la même situation et j'ai fini par ajouter ces alias à mon
.profile
fichier:Ce qui me permet d'écrire des choses comme ça:
la source
function c() { awk "{print \$$1}" }
Ensuite, vous pouvez faire:svn st | c 2 | xargs rm
Essayez le zsh. Il prend en charge les alias de suffixe, vous pouvez donc définir X dans votre .zshrc pour être
alors vous pouvez faire:
Vous pouvez aller plus loin et le définir pour la nième colonne:
qui affichera la nième colonne du fichier "file". Vous pouvez également le faire pour une sortie grep ou une sortie inférieure. Ceci est très pratique et une fonctionnalité tueur du zsh.
Vous pouvez aller plus loin et définir D comme:
Vous pouvez maintenant taper:
pour supprimer tous les fichiers mentionnés dans la première colonne du fichier "fichier".
Si vous connaissez le bash, le zsh n'est pas vraiment un changement, à l'exception de quelques nouvelles fonctionnalités.
HTH Chris
la source
cut
option. Cela ne fonctionne tout simplement pas sur ma machine en utilisant la sortie desvn st
. Essayezsvn st | cut -d' ' -f2
juste de voir ce qui se passe.Parce que vous semblez ne pas être familier avec les scripts, voici un exemple.
Si vous enregistrez ceci dans
~/bin/x
et assurez-vous qu'il~/bin
est dans votrePATH
(maintenant c'est quelque chose que vous pouvez et devriez mettre dans votre.bashrc
), vous avez la commande la plus courte possible pour extraire généralement la colonne n; x n.Le script doit effectuer une vérification des erreurs et une caution appropriées s'il est appelé avec un argument non numérique ou un nombre incorrect d'arguments, etc. mais développer cette version essentielle nue se fera dans l'unité 102.
Vous voudrez peut-être étendre le script pour autoriser un séparateur de colonne différent. Awk par défaut analyse l'entrée dans les champs sur les espaces; pour utiliser un autre délimiteur, utilisez
-F ':'
where:
est le nouveau délimiteur. L'implémenter en tant qu'option du script le rend légèrement plus long, donc je laisse cela comme un exercice pour le lecteur.Usage
Étant donné un fichier
file
:Vous pouvez soit le passer via stdin (en utilisant simplement un espace réservé inutile
cat
pour quelque chose de plus utile);Ou fournissez-le comme argument du script:
Ici,
sh script.sh
suppose que le script est enregistré commescript.sh
dans le répertoire courant; si vous l'enregistrez avec un nom plus utile quelque part dans votrePATH
et que vous le marquez comme exécutable, comme dans les instructions ci-dessus, utilisez évidemment le nom utile à la place (et nonsh
).la source
awk -v col=$col ...
cat
exemple pour des raisons hystériques (-:Il semble que vous ayez déjà une solution. Pour faciliter les choses, pourquoi ne pas simplement mettre votre commande dans un script bash (avec un nom court) et l'exécuter au lieu de taper cette commande `` longue '' à chaque fois?
la source
.bashrc
? Pourquoi voudriez-vous l'encombrer de trucs non liés au bash. Ce que je fais est d'écrire des scripts individuels pour chaque «ensemble» de commandes et de les mettre tous dans un~/scripts
répertoire. Ensuite, ajoutez le tout~/scripts
à monPATH
pour que je puisse simplement les appeler par leur nom lorsque j'en ai besoin.Si vous êtes d'accord avec la sélection manuelle de la colonne, vous pouvez être très rapide en utilisant pick :
Allez simplement dans n'importe quelle cellule de la 2ème colonne, appuyez sur
c
puis appuyez surenter
la source
Notez que ce chemin d'accès au fichier ne doit pas nécessairement être dans la deuxième colonne de la sortie svn st. Par exemple, si vous modifiez le fichier et modifiez sa propriété, ce sera la 3e colonne.
Voir les exemples de sortie possibles dans:
Exemple de sortie:
Je suggère de couper les 8 premiers caractères par:
Si vous voulez être sûr à 100% et gérer les noms de fichiers fantaisistes avec un espace blanc à la fin par exemple, vous devez analyser la sortie xml:
Bien sûr, vous voudrez peut-être utiliser un véritable analyseur XML au lieu de grep / sed.
la source