【发布时间】:2020-09-16 00:16:41
【问题描述】:
所以,我正在尝试创建一个 awk 脚本来检查最后一个命令的输出,以便将其转换为 csv 文件。我遇到的问题是行匹配多次,我不知道如何防止它发生;而且我绝不是 awk 专家(本练习的部分原因)
sed 插入的原因是缺少“列”。
按摩最后一个命令并调用 awk 脚本的命令:
last -w -F | sed -r 's/[[:space:]{23,}/ unknown /;s/(crash|down)/\1 unknown /' | awk -f awktest.awk
(作为旁注,这里的 sub 是在我决定使用 sed 测试插入列之前)
awktest.awk
BEGIN { print "user,tty/pts,connection_from,login_time,state,logoff_time,total_time"}
{if ($1 ~/reboot/) {print $1","$2","$3","$4","($5" "$6" "$7" "$8" "$9)","$10","($11" "$12" "$13" "$14" "$15","$16)}}
{if ($1 ~/root/ && $2 ~/tty/) { sub($3,"null") ; print $1","$2","$3","($4" "$5" "$6" "$7" "$8)","$9","($10","$11","$12" "$13" "$14)}}
#{if ( NF > 14) { print $1","$2","$3","($4" "$5" "$6" "$7" "$8 )","$9","($10" "$11" "$12" "$13" "$14)","$15 }}
{if ($3 == "unknown" && $11 !="unknown") { print $1","$2","$3","($4" "$5" "$6" "$7" "$8 )","$9","($10" "$11" "$12" "$13" "$14)","$15 }}
#{if ($3 == "unknown") { print $1","$2","$3","( $4" "$5" "$6" "$7" "$8 )","$9","($10","$11",")$12}}
{if ($11 == "unknown") { print $1","$2","$3","( $4" "$5" "$6" "$7" "$8 )","$9","($10","$11",")$12}}
如您所见,我尝试了多种方法,要么重复,要么缺少行。重复的很清楚:
root,tty2,null,Sun Jul 19 13:25:38 2020,-,down,unknown,(00:01)
root,tty2,null,Sun Jul 19 13:25:38 2020,-,down,unknown,(00:01)
是的,我知道,不漂亮;但我正在试验;我被困住了,一直在阅读 sed 和 awk 的书,疯狂地谷歌搜索,没有取得任何进展;在这一点上,我想我已经看得太久了,没有取得任何进展。
我做错了什么?
# 为清楚起见进行编辑
(删除了一些空格以使其更清晰) 最后一条命令示例:
root tty3 Mon Jun 8 09:49:56 2020 - down (00:00)
foo :0 0 Mon Jun 8 09:49:16 2020 - down (00:01)
reboot system boot 5.6.16-300.fc32.x86_64 Mon Jun 8 09:48:28 2020 - Mon Jun 8 09:50:54 2020 (00:02)
roncioiu :0 Thu Jun 18 10:19:29 2020 - Thu Jun 18 10:20:19 2020 (00:00)
# 所需的状态列:
- 时间戳记为一列,因为它们在 () 中
"user,tty/pts,connection_from,login_time,state,logoff_time,total_time"
【问题讨论】:
-
不是答案,但我认为如果您直接解析来自
wtmp文件的记录,这会容易得多。您可以在 C 中执行此操作,也可以使用 Python 的 utmp 模块等。 -
我不知道其他人的情况,尤其是像
sed和awk这样的文本处理工具,我一直是sample input和desired output的忠实粉丝。就目前而言,您的 awk sn-p 只是在做我的头脑;)...上面每个匹配行的输入行(无论如何,匿名用户名/IP/主机名)将有很长的路要走。 -
是的,你是对的。我以为很清楚;希望这让它变得更好:)
-
它确实......现在,如果我可以(尽管你付出了所有努力)提出另一个建议?
last如果你使用这个魔法咒语,输出会变得更加易于解析...last -a -w --time-format iso...看看并告诉我你的想法;) -
你能听到我从命令行微笑吗?我喜欢;我要玩一下这个;仍然需要添加一列并删除一些单词,但这更易于管理。让我们看看;谢谢:D