您的位置:首页 > 运维架构 > Shell

shell实践--shell内嵌指令实现查看上线时间

2015-11-09 20:40 483 查看
实践小点子:
1. 做一个shell 内嵌指令例如:ls,cd,pwd这样
就实现查看上线多久;

解决办法有两种:
1) 利用脚本,如新指令为look;利用别名的方法,将look.sh脚本用别名look;而脚本look.sh中则是调用系统uptime , history 等命令 再加上一些数据处理得到 想要显示的结果;当然也要将脚本放入path当中去

仅限今天登陆时间开始计算,也就是说昨天一直登陆的不算噢
方法一:利用脚本,别名的方式
1)编写脚本mysh.sh

zhenxiang@ubuntu:~$ vim mysh.sh
1 #!/bin/bash
2 echo "this is mysh"


2) 在.bashrc中设置别名

zhenxiang@ubuntu:~$ vim  .bashrc
alias my='sh ~/mysh.sh '


3)重新加载.bashrc配置文件

zhenxiang@ubuntu:~$ source .bashrc


4)执行脚本

zhenxiang@ubuntu:~$ my
this is mysh


扩展:
如果要让所有用户都能使用那么配置 /etc/bash.bashrc(ubuntu下)

root@ubuntu:~# vim /etc/bash.bashrc
alias my='sh  /home/zhenxiang/mysh.sh'


重新加载配置文件,执行脚本

root@ubuntu:~# source /etc/bash.bashrc
root@ubuntu:~# my
this is mysh


如题现在要写一个统计上线时间脚本:
w命令
显示项目按以下顺序排列:当前时间,系统启动到现在的时间,登录用户的数目,系统在最 近1秒、5秒和15秒的平均负载。然后是每个用户的各项数据,项目显示顺序如下:登录帐号、终端名称、远 程主机名、登录时间、空闲时间、JCPU、PCPU、当前正在运行进程的命令行。
实例:

zhenxiang@ubuntu:~$ w
10:27:17 up  1:04,  2 users,  load average: 0.60, 0.18, 0.10
USER     TTY      FROM       LOGIN@   IDLE            JCPU          PCPU              WHAT
zhenxian tty7                      09:23      1:04m         35.31s         0.43s                gnome-
zhenxian pts/0    :0.0             10:27    0.00s           0.34s          0.01s                 w
#注意到了吗命令w 首列仅显示8个字符;zhenxiang 只能显示到zhenxian;


有了登陆时间,有了当前时间,那么登陆总时间可以算出来了,就用awk,sed来处理w数据;
当前时间确定:

w | awk 'NR==1 {print $1}'


自己身份确定:

当然用到 whoami 这个命令了
zhenxiang@ubuntu:~$ whoami
zhenxiang


确定终端登陆时间:
重点注意:shell变量与awk变量之间的转换;
方法一:

#!/bin/bash
who=$(whoami)
w | awk -v w="$who" '$1==w {print $1 "\t " $2}'


方法二:

mytest=mmmmm
awk 'BEGIN{print"'$mytest'"}'
因为print除了打印本身数据之外其余均要加双引号,所以在双引号当中加单引号再取变量值就可以得到了;


分离登陆时间并换成分钟数做加减法:

脚本总结:
1.shell脚本中变量赋值没有等号两边没有空格,不然会报错噢;
2.在脚本中可以使用shell 命令行的任何命令,因为shell 命令行本身就是一个脚本;
3. 命令行所得结果要赋值给变量,需要以下形式:变量=$(命令行操作)如: nowtime=$(w | awk 'NR==1 {print $1}')
4.echo 使用使用双引号将忽视特殊字符,是使用单引号则有特殊字符功能
5.awk设置间隔符是动作,所以在{FS=":"},而此时间隔符一般从第二个开始起效因此,一般要搭配 条件BEGIN来使用如:
awk ‘BEGIN {FS=":"} {print $1}’
6.脚本中进行数字加加减减 a=$(($va1-$var2))

2) 自己编写C语言程序,用gcc编译成,可以执行文件,再把可执行文件放入path
linux内置命令如ls cd 是如何加载到linux内核到当中的,自己编写的test.c 用gcc编译过后
只能用./test 或者用别名;ls 这些内置命令 也是用的 别名吗?
感兴趣的朋友自己试试看,直接用C语言编写代码,来实现上述功能;在此我仅抛砖引玉!

必须贴出源码,欢迎交流!!!

1 echo "this is mysh"
2 #w | awk 'NR==1 {print $1}'
3 ##############################
4 #确定nowtime
5 #############################
6 nowtime=$(w | awk 'NR==1 {print $1}')
7 echo 'nowtime:\t'$nowtime
8
9 ##############################
10 #确定使用者
11 #############################
12 who=$(whoami)
13 echo 'l am :  \t'$who
14
15 #############################
16 #确定所有终端登录时间
17 ############################
18 #将shell变量传给awk,变成awk的变量
19 #w | awk -v w="$(whoami)" 'w==$1 {print $1 "\t" $2 "\t" $3 "\t" $4}'
20 #AllLoginTime=$(w | awk -v w=$who 'w==$1 {print $2 "-"$3 }')
21 AllLoginTime=$(w | awk -v w=$who 'w==$1 {print $3 }')
22 echo 'AllLoginTime:\t'$AllLoginTime
23
24 ############################
25 #处理字符串变成分钟数做加减
26 ############################
27 nowtime_h=$(echo $nowtime | awk 'BEGIN {FS=":"} {print $1}')
28 nowtime_m=$(echo $nowtime | awk 'BEGIN{FS=":"}{ print $2}')
29 nowtime_hMintes=$((nowtime_h*60))
30 NowM=$(($nowtime_hMintes+$nowtime_m))
31 #echo 'nowtime mintues:\t' $NowM
32 #echo 'nowtime_h:\t' $nowtime_h
33 #echo 'nowtime_m:\t' $nowtime_m
34 #echo 'nowtime_m-:\t' $nowtime_m
35 AllLoginTime_h=$(echo $AllLoginTime | awk 'BEGIN {FS=":"}{print $1}')
36 AllLoginTime_m=$(echo $AllLoginTime | awk 'BEGIN {FS=":"}{print $2}')
37 loginTime_hMintes=$(($AllLoginTime_h*60))
38 #echo $loginTime_hMintes
39 LogM=$(($loginTime_hMintes+$AllLoginTime_m))
40 #echo 'login time mintues:\t'$LogM
41 #echo 'AllLoginTime_h:\t' $AllLoginTime_h
42 #echo 'AllLoginTime_m:\t' $AllLoginTime_m
43 echo ''now you have logined $(($NowM-$LogM)) mintues''
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: