Shell脚本:在awk中使用命令

时间:2014-05-24 14:56:26

标签: bash shell awk man

这是我的代码

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

3 个答案:

答案 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脚本适用于我:

更新 - 使用基于tripleee's answer

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