将 shell 脚本的输出转换为 .csv

将 shell 脚本的输出转换为 .csv

我想将下面的 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已保存的图案,具有正确的间距。

相关内容