实践小点子:
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''

 

posted on 2015-11-09 20:40  Aiapple  阅读(359)  评论(0编辑  收藏  举报