我是使用 Linux 的完全初学者,我想知道如何将命令行中的一堆数据导出到 csv 或电子表格文件(甚至文本也可以)。现在我只是echo
在一个打印出大量数据的主题上使用。这样我就可以看到数据随着时间的推移而流动。我想要做的就是只分割出带有数字的部分并将它们导出到数据文件中。
例如,如果命令重复流式传输,如下所示:
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: []
等等,随着时间的推移,我想要以下内容:
- 代表位置和的数字
- 代表秒和纳秒的数字,
全部在 csv 文件中。数字是什么,我无法提前知道这个话题会吐出什么。
第二个问题是,有没有办法让它在流式传输期间简单地导出所有这些数字,或者我是否必须流式传输几秒钟,然后运行命令来获取它吐出的所有数字事后出来?
答案1
该问题已被编辑以包含完全不同格式的数据。原始答案位于该行下方,其中与sed
一般相关的部分仍然适用。
sed
可以将行重写为其他格式。下面是一个快速sed
命令,可为您提供此新数据的每条记录的 CSV 行:
sed -n -e '/secs:/{s/.*secs://;H;};/position:/{s/^.*position: \[\([^]]*\)\]/\1/;G;s/\n\+/,/gp}'
这使用了保留空间。另一方面,你真正想要的是YAML解析器;仅仅因为我们可以使用其他工具来做到这一点sed
并不意味着我们应该这样做。
要同时进行替换和 grep 操作sed
,您可以使用-n
和p
:
sed -n -e 's/foo/bar/p'
至于读取数据,只要是流式传输的,都可以使用壳牌管道去做这个:
yourcommand | sed -e '...'
yourcommand
这会将直接的输出放入sed
的输入中,它可以在其中为您处理矢量场,如上所示。当yourcommand
管道完成时,管道也会完成。
要将sed
输出重定向到文件中,您可以使用输出重定向:
yourcommand | sed -e '...' > vectors.csv
这将创建一个 CSV 文件,vectors.csv
其中包含命令的输出sed
。
data
给定一个(原始)格式的文件:
time position t x: [0.1 1]
time position t x: [0.2 2]
time position t x: [0.3 3]
你可以运行:
sed -e 's/.*\[\([^]]*\)\].*/\1/' data
并获得以下形式的输出:
0.1 1
0.2 2
0.3 3
您可能需要用逗号分隔,所以我们也可以这样做:
sed -e 's/.*\[\([^ ]*\) \([^]]*\)\].*/\1,\2/' < data
0.1,1
0.2,2
0.3,3
sed
提供了一种用于重写行的编程语言,我们使用它的s
命令来对行进行字符串替换正则表达式描述了整条线。
该模式位于第一个和第二个/
字符之间。我们.*
在外面,以匹配线路的其余部分(我们将扔掉它,但我们需要在某个地方解决)。
我们将[
和]
作为我们关心的边缘以及其中的两个数字进行匹配。因为正则表达式语法也用来[]
表示某种含义,所以我们在我们想要的字面意思之前添加反斜杠。这些就在.*
s 里面。
在这两者之间,\( \)
我们捕获在那里匹配的文本。在这种情况下,文本由表达式 描述[^ ]*
,这意味着除空格之外的许多字符。然后,我们会匹配数据中的文字空格,后跟另一个捕获组。第二组匹配[^]]*
,这意味着除 a 之外的许多字符]
。最后,我们匹配终止]
符\]
。
第二个和第三个之间的部分/
是替换字符串,我们可以将两个捕获的组引用为 和\1
:\2
例如,第一行的\1
变得0.1
和\2
成为。1
任何其他字符都按字面意思包含在输出中,因此分隔逗号出现在它们之间。
答案2
尝试
df -h | sed 's/[ \t]/,/g'
或者
df -h | sed 's/[ \t]/,/g'