我需要编写一个bash脚本,用于检查新用户是否在5秒内登录,如果是,请打印它的详细信息:name,username,...... 我已经有以下代码,它会检查新用户是否已登录:
originalusers=$(users)
sleep 5
newusers=$(users)
if diff -u <(echo "$originalusers") <(echo "$newusers")
then
echo "Nothing's changed"
exit 1
else echo "New user is logged in"
diff -u <(echo "$originalusers") <(echo "$newusers") >shell
答案 0 :(得分:0)
这是一个。它是一个使用awk计算出口和条目的bash脚本。
$ cat script.sh
#!/bin/bash
read -d '' awkscript <<EOF # awk script is stored to a variable
BEGIN{
split(now,n)
split(then,t)
for(i in n)
a[n[i]]++
for(j in t)
a[t[j]]--
for(i in a)
if(a[i])
print i, (a[i]>0?"+":"") a[i] " sessions"
}
EOF
while true # loop forever
do
sleep 1 # edit wait time to your liking
then="$now"
now="$(users)"
awk -v then="$then" -v now="$now" "$awkscript"
done
运行它:
$ bash script.sh
james 14 sessions # initial amount of my xterms etc.
james +1 sessions # opened one more xterm
james -1 sessions # closed one xterm
真的没有任何地方可以测试它,有很多用户来来往往。
答案 1 :(得分:0)
如果我正确理解了这个问题,你想找到两个Bash变量之间的差异,并保持新变量的差异。一种可能性是将diff结果保存到变量中:
diff_result=`diff -u <(echo "$originalusers") <(echo "$newusers")`
echo -e "diff result:\n$diff_result"
但是,如果使用此代码,您仍然需要解析diff结果。另一种可能性是使用comm命令:
originalusers_lines=`sed -e 's/ /\n/g' <(echo "$originalusers") | sort -u`
newusers_lines=`sed -e 's/ /\n/g' <(echo "$newusers") | sort -u`
comm_result=`comm -13 <(echo "$originalusers_lines") <(echo "$newusers_lines")`
echo -e "new users:\n$comm_result"
前两行创建按行分隔的用户名的排序唯一列表。 comm命令用于查找仅出现在新用户名列表中的用户名。