Comment exporter des données dans le terminal vers un file (par exemple un file csv)

Je suis un débutant complet dans l'utilisation de Linux et j'aimerais savoir comment exporter un tas de données dans la command line vers un file csv ou tableur (ou même du text). En ce moment, j'utilise simplement l' echo sur un sujet qui imprime une tonne de données. Ainsi, je peux voir datatables comme elles se diffusent au fil du time. Ce que je veux faire est de couper seulement les parties avec des nombres et de les exporter dans un file de données.

Donc, par exemple, si la command diffuse continuellement quelque chose comme:

 header: seq: 93342 stamp: secs: 1406820172 nsecs: 191358647 frame_id: '' name: ['arm_joint_1', 'arm_joint_2', 'arm_joint_3', 'arm_joint_4', 'arm_joint_5', 'gripper_finger_joint_l', 'gripper_finger_joint_r'] position: [2.116426527797216, 1.8058519002096407, -1.6111500844302575, 3.479512978878036, 2.8513271915116376, 0.0, 0.0] velocity: [-0.0, -0.0, 0.0, -0.0, -0.0, 0.0, 0.0] effort: [] --- header: seq: 93343 stamp: secs: 1406820172 nsecs: 211357280 frame_id: '' name: ['arm_joint_1', 'arm_joint_2', 'arm_joint_3', 'arm_joint_4', 'arm_joint_5', 'gripper_finger_joint_l', 'gripper_finger_joint_r'] position: [2.116426527797216, 1.8058519002096407, -1.6111500844302575, 3.479512978878036, 2.8513271915116376, 0.0, 0.0] velocity: [-0.0, -0.0, 0.0, -0.0, -0.0, 0.0, 0.0] effort: [] 

etc, au fil du time, je veux juste ce qui suit:

  1. Les numbers représentant la position et
  2. Les nombres représentant Secs et Nsecs,

tout dans un file csv. Les numbers sont ce qu'ils sont et je n'ai aucun moyen de savoir ce que ce sujet crachera à l'avance.

Une question secondaire est: existe-t-il un moyen pour exporter simplement tous ces nombres aussi longtime qu'il est en streaming, ou dois-je diffuser pendant quelques secondes, puis exécuter une command pour saisir tous les nombres qu'il crache dehors après le fait?

La question a été modifiée pour inclure des données dans un format totalement différent. La réponse originale est en dessous de la ligne, et les parties de celle-ci concernant sed en général s'appliquent toujours.

sed peut réécrire des lignes dans d'autres formats . Voici une command sed rapide pour vous donner une ligne CSV par logging pour ces nouveldatatables:

 sed -n -e '/secs:/{s/.*secs://;H;};/position:/{s/^.*position: \[\([^]]*\)\]/\1/;G;s/\n\+/,/gp}' 

Cela utilise l' espace de cale . D'autre part, ce que vous voulez vraiment ici est un parsingur YAML ; juste parce que nous pouvons le faire avec sed ou d'autres outils ne signifie pas que nous devrions le faire.

Pour faire un rlocation et un grep en même time avec sed , vous pouvez utiliser -n et p :

 sed -n -e 's/foo/bar/p' 

En ce qui concerne la lecture des données tant que la diffusion est en cours, vous pouvez utiliser les pipelines shell pour faire ceci:

 yourcommand | sed -e '...' 

Cela met la sortie de votre yourcommand directement dans l'input de sed , où elle peut traiter les champs de vectors pour vous comme ci-dessus. Lorsque votre yourcommand termine, le pipeline est terminé.

Pour redirect la sortie sed dans un file, vous pouvez également utiliser la redirection de sortie :

 yourcommand | sed -e '...' > vectors.csv 

Cela fera un file CSV appelé vectors.csv avec la sortie de votre command sed .


Compte tenu des data file dans votre format (original):

 time position tx: [0.1 1] time position tx: [0.2 2] time position tx: [0.3 3] 

vous pourriez courir:

 sed -e 's/.*\[\([^]]*\)\].*/\1/' data 

et get la sortie de la forme:

 0.1 1 0.2 2 0.3 3 

Vous pourriez vouloir séparer par des virgules, afin que nous puissions le faire aussi:

 sed -e 's/.*\[\([^ ]*\) \([^]]*\)\].*/\1,\2/' < data 0.1,1 0.2,2 0.3,3 

sed fournit un langage de programmation pour réécrire les lignes et nous utilisons sa command s pour effectuer un rlocation de string sur l' expression régulière décrivant toute la ligne.

Le motif se situe entre le premier et le second caractères. Nous avons .* l'extérieur, pour correspondre au rest de la ligne (que nous allons jeter, mais nous devons nous adresser quelque part).

Nous faisons correspondre [ et ] comme les bords de ce qui nous intéresse, et les deux nombres à l'intérieur d'eux. Parce que la syntaxe d'expression régulière utilise également [] pour signifier quelque chose, nous mettons des barres obliques avant celles que nous voulons littéralement. Ceux-ci sont juste à l'intérieur du .* S.

Entre \( \) nous capturons le text que nous associons là. Dans ce cas, ce text est décrit par l'expression [^ ]* , ce qui signifie beaucoup de caractères sauf un espace. Ensuite, nous faisons correspondre un espace littéral de vos données, suivi par un autre groupe de capture. Le second groupe correspond à [^]]* , ce qui signifie beaucoup de caractères sauf a ] . Enfin, nous associons la terminaison ] avec \] .

La partie entre la deuxième et la troisième est la string de rlocation, et nous pouvons référer à nos deux groupes capturés comme \1 et \2 dedans: \1 devient 0.1 et \2 devient 1 pour la première ligne, par exemple. Tous les autres caractères sont inclus littéralement dans la sortie, de sorte que la virgule de séparation apparaît entre eux.


essayer

df -h | sed 's/[ \t]/,/g'

ou

df -h | sed 's/[ \t]/,/g'