【问题标题】:Parsing last with sed and awk to create a csv file最后用 sed 和 awk 解析创建 csv 文件
【发布时间】: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 模块等。
  • 我不知道其他人的情况,尤其是像sedawk 这样的文本处理工具,我一直是sample inputdesired output 的忠实粉丝。就目前而言,您的 awk sn-p 只是在做我的头脑;)...上面每个匹配行的输入行(无论如何,匿名用户名/IP/主机名)将有很长的路要走。
  • 是的,你是对的。我以为很清楚;希望这让它变得更好:)
  • 它确实......现在,如果我可以(尽管你付出了所有努力)提出另一个建议? last 如果你使用这个魔法咒语,输出会变得更加易于解析...last -a -w --time-format iso ...看看并告诉我你的想法;)
  • 你能听到我从命令行微笑吗?我喜欢;我要玩一下这个;仍然需要添加一列并删除一些单词,但这更易于管理。让我们看看;谢谢:D

标签: linux csv security awk


【解决方案1】:

因此,在@tink 的温和推动下,我最终选择了一个班轮并放弃了剧本。只需一点点数据处理。

感谢您的提示!换一种方式,我失去了理智。

last -a -w --time-format iso | sed -r 's/\sboot\s//g;/^$/d;/wtmp/d;/(crash|down)/s/$/ unknown /' | awk 'BEGIN { print "user,pts/tty,login_time,state,logoff_time,total_time,host "} { print $1","$2","$3","$4","$5","$6","$7}'

【讨论】:

  • 好东西 =} ...为你骄傲! ;)
猜你喜欢
  • 2016-05-04
  • 2015-01-12
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多