用于将输出转换为Excel工作表的脚本

时间:2012-10-17 19:47:35

标签: linux excel bash

我的文件包含以下数据:

-------------------[ server10 ]-------------------
user1
user2
user99
user100
-------------------[ server20 ]-------------------
user1
user2
user10
user4
-------------------[ server30 ]-------------------
user10
user30
user40

我想将此输出转换为Excel工作表,以便我可以向管理层提供ti。任何想法怎么办?

我想在Excel工作表中将输出格式化为以下格式:

Hostname            users
server10            user1
                    user2
                    user99
                    user100
server20            user2
                    user10
                    user4 
...
...

直到这里“大卫”帮助我使用Python(openpyxl)。但是这里我有新列(上次登录时间),我想在excel中添加,所以这里是示例。

    -------------------[ server10 ]-------------------
    user1
    never
    user2
    Oct 17, 2011
    user99
    Jan 01, 2007
    user100
    Feb 02, 2010
    -------------------[ server20 ]-------------------
    user1
    never
    user2
    never
    user10
    jul 17, 2001
    user4
    Dec 25, 1999
    -------------------[ server30 ]-------------------
    user10
    Aug 10, 2012
    user30
    never
    user40
    never

在excel中就是这样。

 Hostname            users           Last logon
    server10            user1            never
                        user2            Oct 17, 2011
                        user99           ...
                        user100          ...
    server20            user2
                        user10
                        user4 
    ...
    ...

注意:这里的用户名可能不同我给你举了例子userX但是它会是spatel,jim,eric等......

4 个答案:

答案 0 :(得分:3)

另一种方法是在python中使用openpyxl模块:

from openpyxl import Workbook
import fileinput
import re

wb = Workbook()
ws = wb.get_active_sheet()

servercol = 0
usercol = 1
lastlogoncol = 2
currentrow = 1

# write column headers
ws.cell(row=0, column=servercol).value = 'server'
ws.cell(row=0, column=usercol).value = 'user'
ws.cell(row=0, column=lastlogoncol).value = 'last logon'

# process each line and copy to spreadsheet
for line in fileinput.input("somedata.txt"):
    # user regex to extract server from line
    m = re.match("^[-\[\s]+(?P<server>server\d+)[-\]\s]+$", line)
    n = re.match("^\s+user\d+", line)
    # if server match then write to server column
    if(m):
        c = ws.cell(row = currentrow, column = servercol)
        c.value = m.group('server')
    # elif user match, then write to user column
    elif(n):
        c = ws.cell(row = currentrow, column = usercol)
        c.value = line
    # else write to last logon column
    else:
        c = ws.cell(row = currentrow, column = lastlogoncol)
        c.value = line
        currentrow = currentrow + 1

wb.save('mydata.xlsx')

注意:这有点脆弱,因为它依赖于内联数据始终跟随“最后登录”记录的“用户”记录。如果未遵循此模式,则该过程将失败。例如,如果您有两个连续的用户记录,则中间没有“上次登录”记录。

答案 1 :(得分:2)

我认为最简单的方法是使用CSV(逗号分隔值)格式。 我们的想法是重新格式化您的输出:

server 10 , user 1
 , user 2
 , user 3
 , user 4
server 20, user 1
, user 2
, user 3
etc.

然后将CSV文件导入excel,选择“CSV”,然后选择“格式化”并确保用逗号分隔值。我们以后将脚本调用tocsv.sh:

#!/bin/bash 
cat $1 | while read line
do
    user=''
    # if the line starts with ----, remove ---[ and ]----
    testServer=$(sed -n '/---/p' <<< $line)
    if [ -n "$testServer" ]; then
    server=$(sed '/----/ s/-*\[// ; s/\]-*//' <<< $line)
    user=''
    else 
    user=$line
    fi

    if [  -n "$user" ]; then
    echo $server ", "$user
    server=''
    fi

done

如果dataserver.txt是数据的文本文件,那么您可以: ./tocsv.sh dataserver.txt > dataserver.csv 您可以将dataserver.csv导入Excel。

答案 2 :(得分:1)

此解决方案假设您希望数据的每一行占用同一列中的一个单元格。

  1. 如果您还没有这样做,请将数据保存为文本(* .txt)文件。
  2. 启动Excel
  3. 从“文件”选项卡或菜单中选择“打开”(取决于版本)
  4. 列表项
  5. 在“打开”对话框中,找到下拉菜单并选择“文本文件”选项
  6. 使用对话框控件导航到包含文本文件中的数据的目录
  7. 选择文本文件,然后单击“打开”按钮,这将启动“导入向导”
  8. 在第一个屏幕上,选择“分隔”,然后单击“下一步”
  9. 在第二个屏幕上单击“下一步”
  10. 在最后一个屏幕上单击“完成”

答案 3 :(得分:0)

Python中现有的库可以帮助您解决这个问题:

http://www.python-excel.org/

我不知道任何用于生成excel文件的简单shell脚本解决方案。