J'ai 3 variables que j'utilise printf pour aligner leurs sorties Je sais que le premier Var est une ligne de sorte que le 2e var aussi bien Le problème avec le 3ème var est que cette variable a une production énorme, je voudrais donc les énumérer alignées (j'espère que ci-dessous effacerait ma question)
** Je n'ai pas la commande de colonne ** p>
J'utilise p>
et j'en ai besoin comme suit: p>
printf "% -20s% -5s% -20s \ n" "$ {out}" "$ {compte}" "$ {data}"
code> p>
3 Réponses :
#!/bin/bash OUT="GATE1" COUNT="14" DATA="CU4 CU2 CU9var CU3 CU1 CU11admin CU10opt not_sy CU_doonce cutttCU clocal_CU global_CU tivoli_CU" while [[ -n $DATA ]] do printf "%-20s %-5s %-20s \n" "${OUT}" "${COUNT}" "${DATA:0:48}" OUT=" " COUNT=" " DATA="${DATA:48}" done
"$ {Data: 0: 48}": 0403-011 La substitution spécifiée n'est pas valide pour cette commande.
@mshafey est qu'une erreur se produisant lors de l'exécution de ce que j'ai écrit ci-dessus en tant que script? Si oui, quelle version de bash?
La version Bash est Bash-5.0-2
Exécuter le script ci-dessus fonctionne pour moi dans les deux 4.4 code> et
5.0 code>. Vous ne faites que sauvegarder le total du bloc ci-dessus pour le déposer et l'exécuter ou la coller directement dans Interactive Bash, et avoir cette erreur?
OUI a sauvegardé le vôtre dans un fichier et il a donné ci-dessus NOTE Ceci n'est pas Linux
semble être un bug dans bash sur Aix alors, idk quoi d'autre pourrait-il être
sûr qu'il pourrait être - j'avais l'habitude de voir les différences entre bash sur Aix et Linux
Fix pragmatique: essayez data = "$ {data: 48: 1000}" code>? Notez que cela ne se divise pas sur les espaces ni les nouvelles lignes de données dans les données, mais c'est plus de travail. Il semblera de tort s'il y a des lignes neuves dans les données.
@Gemtaylor C'est le : 0: 48 code> Développement des paramètres qui échoue
OK, peut-être utiliser les trucs de regex: si [["$ data = ~ ^ (. {48,48}) (. *) $]]; Alors code>
imprimante =" $ {bash_rematch [1]} " code>
data =" $ {bash_rematch [2]} " code>
ele code>
printNow =" $ données " code>
Data = code>
fi code>
@Gemtaylor nous devons l'envelopper dans un moment (0) avec une pause
Sachez que l'OP est en cours d'exécution sur un système AIX et probablement une ancienne version de KSH. L'erreur dans le premier commentaire semble pointer à cela.
@ kvantour à moins d'avoir acheté le script dans ksh code> par accident, ils exécutent
Bash-5.0-2 code> comme ils ont mentionné ci-dessus. Mais oui, une erreur semble pointer à cela.
Ma suggestion de regex était tout comme une alternative à la phrase $ {data: 0: 48} code> Vous auriez toujours besoin du reste du code de boucle. D'autre part, c'est 100% bash, et si vous avez maintenant décidé que votre moteur de script n'est pas bash, cela ne fonctionnera pas également.
Pourriez-vous s'il vous plaît essayer suivi.
your_command | awk ' /GATE/{ space=sprintf("%*s",index($0,$3),"") } !/^GATE/{ $0=space $0 } 1'
Je ne sais pas comment utiliser votre code dans ma ligne d'impression
@mshafey, vous n'avez pas besoin de ne pas l'utiliser dans Printf, il suffit d'exécuter un code avec votre Input_File et voyez ce qui se passe.
@mshafey, tuyer votre boucle avec echo $ OUT $ Compter $ Data code>
Je suis passé au-dessus de l'awk, mais il a donné le même résultat
@mshafey, veuillez réussir votre commande complète comme "quelques commandes d'écho | puis au-dessus de la commande`, etc. Par exemple et essayez alors?
Mon nom de script est CLD, il a donné la mauvaise sortie que j'ai besoin d'aligner - j'utilise votre code comme >> #. / CLD | (Votre awk) est-ce correct?
@mshafey, oui si vous êtes un script le faire comme your_script.sh | mon code AWK code> et lemme savent alors?
val = index (0 $, 3 $); tandis que (++ i
espace = sprintf ("% * s", index ($ 0, 3 $), "") code>.
@Edmorton, merci monsieur monsieur j'ai ajouté cette solution maintenant, merci de me laisser savoir monsieur, acclamations.
Vous utilisez la ligne suivante pour imprimer vos lignes: Le problème que vous avez est que Exemple: P> $ {data} code> contient des caractèresWLINE. Nous pouvons en déduire que vous essayez d'imprimer une chaîne de plus de 20 caractères dans un champ à 20 caractères (votre format le montre). Ce sont ces caractèresWLINE qui garantissent que vos données se poursuivent au début de la ligne suivante. Si vous voulez les aligner, vous devez faire une petite substitution de vos nouvelles lignes dans cette variable. P>
$ printf "%-20s %-5s %-20s \n" "${OUT}" "${COUNT}" "${DATA}" \
| gawk -v RS= '{gsub(ORS,ORS sprintf("%27s",""))}1'
./cld3[11]: "" $ {fs // $ "\\ n" / $ "\\ n" $ (printf "% 27s" "")} "": 0403-011 La substitution spécifiée n'est pas valide pour cette commande.
@mshafey semble que vous avez deux backslashes.
J'ai utilisé $ printf "% -20s% -5s% -20s \ n" "$ {out}" "$ {compte}" "$ {data // $ '\ n' $ (printf" % 27s "" ")}"
il a donné une erreur comme >>> ./cld3[11]: "$ {fs // $ \ n / $ \ n $ (printf"% 27s "" ")}": 0403-011 La substitution spécifiée n'est pas valide pour cette commande.
@mshafey quel shell utilisez-vous et quel système?
L'exemple fonctionne-t-il pour vous que j'ai présenté ci-dessus?
Il semble que vous n'exécutez pas BASH mais une ancienne version de KSH, est-ce possible?
ksh sur Aix non linux
Cependant, j'ai une fonctionnalité de bash installée ici mais pas la totalement bash que nous avons utilisée dans des systèmes Linux - de toute façon je peux confirmer que je suis ksh
Laissez-nous Continuez cette discussion en chat .
Avoir des variables de shell avec des noms tels que le compte et les données et essayer de les imprimer de la sorte implique que vous avez quitté les rails et essayez d'utiliser un script shell pour faire quelque chose que les coquilles ne sont pas conçues pour faire, c'est-à-dire le traitement du texte. Publiez une nouvelle question si vous souhaitez aider à faire ce que vous faites de la bonne façon plutôt que de mettre de l'aide à la bande.