我想将下面的 patchhistory.sh shell 脚本的输出转换为 csv,以便我可以获得如下列格式的信息:
servername patch history uptime
1.test-tch008.test.com rsyslog Mon 16 Jul 2018 04:36:50 AM EDT 02:18:20 up 953 days, 8:16, 1 user, load average: 0.08, 0.06, 0.08
[root@test-ops002 tmp]# ./patchhistory.sh test-tch008.test.com rsyslog 2018 年 7 月 16 日星期一 上午 4:36:50 EDT 02:18:20 启动 953 天,8:16,1 个用户,平均负载:0.08、0.06、0.08 与 test-tch008 的连接已关闭。 test-twh005.test.com rsyslog 2018 年 7 月 16 日星期一 上午 4:37:08 EDT 02:18:21 启动 1750 天,13:38,1 个用户,平均负载:0.07、0.14、0.17 与 test-twh005 的连接已关闭。 test-vch108.test.com rsyslog 2018 年 7 月 16 日星期一 上午 4:38:55 EDT 02:18:23 启动 94 天,1:33,1 个用户,平均负载:0.30、0.28、0.27 与 test-vch108 的连接已关闭。 test-vch109.test.com rsyslog 2018 年 7 月 16 日星期一 上午 4:39:03 EDT 02:18:25 启动 31 天,1:22,1 个用户,平均负载:0.18、0.10、0.08 与 test-vch109 的连接已关闭。 test-vch110.test.com rsyslog 2018 年 7 月 16 日星期一 上午 4:39:58 EDT 02:18:26 启动 31 天,1:03,1 个用户,平均负载:0.14、0.21、0.09 与 test-vch110 的连接已关闭。 test-vwh114.test.com rsyslog 2018 年 7 月 16 日星期一 上午 4:45:18 EDT 02:18:28 启动 84 天,5:06,1 个用户,平均负载:0.22、0.19、0.12 与 test-vwh114 的连接已关闭。 test-vwh115.test.com rsyslog 2018 年 7 月 16 日星期一 上午 4:46:10 EDT 02:18:30 启动 12 天,4:27,1 个用户,平均负载:0.13、0.16、0.11 与 test-vwh115 的连接已关闭。 test-vwh116.test.com rsyslog 2018 年 7 月 16 日星期一 上午 4:46:17 EDT 02:18:32 启动 84 天,6:09,1 个用户,平均负载:0.10、0.16、0.23 与 test-vwh116 的连接已关闭。 test-vwh117.test.com rsyslog 2018 年 7 月 16 日星期一 上午 4:46:26 EDT 02:18:33 启动 29 天,14:31,2 个用户,平均负载:0.32、0.19、0.19 与 test-vwh117 的连接已关闭。 test-vxh104.test.com rsyslog 2018 年 7 月 16 日星期一 上午 4:49:11 EDT 02:18:35 启动 953 天,9:02,2 个用户,平均负载:0.06、0.03、0.00 与 test-vxh104 的连接已关闭。
答案1
好吧,看起来我们可以做到sed
:)
对我来说这看起来没问题(首先|
我假设你会将脚本的输出传递到命令中):
| sed -r '/test/ N;N;N; s/(.*)\n([A-Za-z]*)\s*(.*)\n(.*)\n.*/\1 \2 \3 \4/'
test-tch008.test.com rsyslog Mon 16 Jul 2018 04:36:50 AM EDT 02:18:20 up 953 days, 8:16, 1 user, load average: 0.08, 0.06, 0.08
test-twh005.test.com rsyslog Mon 16 Jul 2018 04:37:08 AM EDT 02:18:21 up 1750 days, 13:38, 1 user, load average: 0.07, 0.14, 0.17
test-vch108.test.com rsyslog Mon 16 Jul 2018 04:38:55 AM EDT 02:18:23 up 94 days, 1:33, 1 user, load average: 0.30, 0.28, 0.27
test-vch109.test.com rsyslog Mon 16 Jul 2018 04:39:03 AM EDT 02:18:25 up 31 days, 1:22, 1 user, load average: 0.18, 0.10, 0.08
但是如果你想放入那个标题行......好吧,我只能想到这种丑陋的方式......
| sed -r '1 s/^/servername patch history uptime\n/; /test/ N;N;N; s/(.*)\n([A-Za-z]*)\s*(.*)\n(.*)\n.*/\1 \2 \3 \4/'
servername patch history uptime
test-tch008.test.com rsyslog Mon 16 Jul 2018 04:36:50 AM EDT 02:18:20 up 953 days, 8:16, 1 user, load average: 0.08, 0.06, 0.08
test-twh005.test.com rsyslog Mon 16 Jul 2018 04:37:08 AM EDT 02:18:21 up 1750 days, 13:38, 1 user, load average: 0.07, 0.14, 0.17
test-vch108.test.com rsyslog Mon 16 Jul 2018 04:38:55 AM EDT 02:18:23 up 94 days, 1:33, 1 user, load average: 0.30, 0.28, 0.27
test-vch109.test.com rsyslog Mon 16 Jul 2018 04:39:03 AM EDT 02:18:25 up 31 days, 1:22, 1 user, load average: 0.18, 0.10, 0.08
解释
-r
使用扩展的正则表达式-节省一些反斜杠s/old/new/
old
用。。。来代替new
1 s/^/literally what I want to insert\n/
将第一行的开头替换为标题行,以新行结尾。幸运的是,在此上下文中将sed
其解释\n
为换行符。/test/
找到一条线test
N;N;N
也读入接下来的三行,这样我们就可以\n
在正则表达式中使用并处理所有三行(.*)
保存任意数量的任意字符(保存整行)([A-Za-z])
保存一堆字母(这是,因此如果它总是相同的,rsyslog
那么你可以只写)。rsyslog
\s
水平空白\1 \2 \3 \4
已保存的图案,具有正确的间距。