1

我正在做一个 bash 脚本,它应该搜索用户是否曾经登录过计算机,我已经来到下面的这一部分,不知道该怎么做。

我创建了一个循环来读取 wtmp 文件(已经复制并解压缩),并显示所有行与用户(这部分有效)。但是,当找不到用户时,脚本应该通知它,但我不知道该怎么做。

ls -1t $folder/wtmp* 2> /dev/null| while read filename ;
do
    last -f "${filename}" 2>/dev/null | grep $user | cut -c 1-7,40-63
done

我会感谢一个好的建议,人们:-)

4

2 回答 2

0

grep如果找不到请求的正则表达式,将以非零退出状态退出,因此您可以将所有调用的输出通过管道传递到 last 通过一次调用 to cut,然后通过一次调用 to grep,这将输出匹配行,或者没有找到并导致列表的其他部分执行。

for filename in "$folder"/wtmp*; do
  last -f "${filename}"     
done 2> /dev/null | cut -c 1-9,40-63 | grep $user || echo "$user not found"

此外,不需要调用ls,因为您用作参数的 globls可以直接由 for 循环使用来遍历目录中的文件。

(我调整了字符范围,以便您获得完整的 8 个字符的用户名加上一个空格来分隔用户名和时间戳。)

于 2013-01-22T17:08:24.660 回答
0

好的,在你做你的循环之前使用 pipefail。Pipefail 是一个 bash 选项,它将在命令管道中返回最右边的非零错误状态。

例如,您的问题如下

last -f file | grep user | cut -c 1-7

 succeeds        fails      succeeds

但是 bash 默认只会使用 cut 命令的退出代码作为管道的退出代码( $? )

如果你

set -o pipefail

首先将使用 grep 的退出状态

所以:

set -o pipefail
ls -1t $folder/wtmp* 2> /dev/null| while read filename ;
do
    last -f "${filename}" 2>/dev/null | grep $user | cut -c 1-7,40-63
    [[ $? -gt 0 ]] && echo "user not found in $filename"
done
set +o pipefail
于 2013-01-22T16:30:57.083 回答