这是我的代码
awk '{a[$1":"$5]}
END{for(i in a)
{
split(i,b,":");
split(b[2],c,"[");
print b[1],b[2]
}
}' /var/log/messages
输出为:(显示月份和流程名称)
May init
May rhsmd
May kernal
我想将流程名称更改为简短描述。 简短描述基于" man"文档。
这个命令帮我打印我想要的东西。
man init | sed -n '6p' | cut -c 8-
输出:
init - Upstart process management daemon
最后,我无法找到一种方法来嵌入" man"代码到awk。 以下是我预期的最终输出, 我怎样才能做到这一点?谢谢。
May init - Upstart process management daemon
May rhsmd - A Program for querying the Red Hat Network for updates and information
May kernal
有/ var / log / messages
的一些示例May 21 03:30:02 redhat rhsmd: This system is registered to RHN Classic.
Sep 22 03:35:02 redhat rhsmd: This system is registered to RHN Classic.
May 22 13:00:31 redhat init: serial (hvc0) main process (1326) killed by TERM signal
May 22 13:00:31 redhat init: tty (/dev/tty6) main process (1336) killed by TERM signal
May 22 13:00:32 redhat rhnsd[1256]: Exiting
答案 0 :(得分:2)
我会为此使用shell。
awk '{a[$1":"$5]}
END{for(i in a)
{
split(i,b,":");
split(b[2],c,"[");
print b[1],b[2]
}
}' /var/log/messages |
while read month cmd; do
echo -n "$month "
whatis "$cmd"
done
答案 1 :(得分:1)
你可以尝试:
awk '{a[$1":"$5]}
END{
for(i in a) {
split(i,b,":");
cmd="man "b[2]" 2>/dev/null | sed -n '6p' | cut -c 8-"
cmd | getline result
print b[1],result
}
}' /var/log/messages
答案 2 :(得分:1)
这个awk
脚本适用于我:
whatis
#!/usr/bin/awk -f
$NF !~ /Exiting/ {
split($5, a, ":")
name = a[1]
if (!s[name]) {
"whatis " name | getline w
if (w !~ /nothing/) {
split(w,b,"- ")
s[name] = b[2]
}
else s[name] = "none"
}
printf("%s %s %s\n", $1, a[1], (s[name] != "none" ? "- " s[name] : ""))
}
这将从whatis
数据库构建程序描述的缓存,因此每个进程只查找一次。如果没有条目,我的系统whatis
会给出消息name: nothing appropriate
,因此请在结果中检查该条目。它仅报告不以“退出”结束的行。
示例输出(请注意我的系统上没有rhsmd
):
May rhsmd
Sep rhsmd
May init - process control initialization
May init - process control initialization