我的文件包含以下数据:
-------------------[ 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等......
答案 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)
此解决方案假设您希望数据的每一行占用同一列中的一个单元格。
答案 3 :(得分:0)