0

在这里遇到了一点问题,希望有人能指出我正确的方向。我正在尝试编写一个网页/脚本来显示我们的 FTP 用户上次登录时间、主目录大小和上次连接它的 IP。

我让他们每个人都单独工作,但需要帮助将他们联系在一起。

最大的问题是这个;

我有一个家庭目录列表设置为变量

[root@myserver ~]# echo $userdirs
user1 user2 user3 user4

现在我要做的就是在 xfer 日志中搜索这些用户并粘贴结果(不包括其他所有内容)

这就是我卡住的地方

for user in $echo $userdirs; do cat /var/log/xferlog |  awk '/10/ { print $4, $7, $14}'; done

这似乎为 $userdirs 中的每个用户运行命令“/var/log/xferlog | awk '/10/ { print $4, $7, $14}'”

我究竟做错了什么?:(

4

2 回答 2

0

您可以创建这样的脚本:

#!/bin/bash

userdirs=(user1 user2 user3 user4)

awk '
BEGIN {
    for (i = 2; i in ARGV; ++i) {
        j = ARGV[i]
        users[j] = 1
        ARGV[i] = ""
    }
}
$N in users {
    print $4, $7, $14
}' /var/log/xferlog "${userdirs[@]}"

Nin替换为包含用户$N 的字段编号。/var/log/xferlog

将其保存到 script.sh 之类的脚本并运行bash script.sh.

Awk 可能的最小化形式:

awk 'BEGIN{for(i=2;i in ARGV;++i){j=ARGV[i];users[j]=1;ARGV[i]="";}}$N in users{print $4,$7,$14}' /var/log/xferlog "${userdirs[@]}"
于 2013-09-01T19:29:42.080 回答
0

FWIW您可以稍微调整@konsolebox的答案以仅打印每个目录的最后一个条目:

userdirs="user1 user2 user3 user4"

awk -v userdirs="$userdirs" '
BEGIN { split(userdirs,users) }
{
    for (i=1; i in users; i++)
        if ($N == users[i])
            entry[i] = $4 OFS $7 OFS $14
}
END {
    for (i=1; i in users; i++)
        if (i in entry)
            print entry[i]
}
' /var/log/xferlog

我做了一些其他的小改动,主要是风格上的,主要是因为我个人不喜欢解析 ARGV 列表只是为了传入一个字符串的想法——恕我直言,只有在需要将变量设置为不同的值时才应该使用它在打开不同文件之间。

于 2013-09-02T11:58:31.613 回答