zoukankan      html  css  js  c++  java
  • shell实践--shell内嵌指令实现查看上线时间

    实践小点子:
    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 "	 " $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:	'$nowtime
      8 
      9 ##############################
     10 #确定使用者
     11 #############################
     12 who=$(whoami)
     13 echo 'l am :  	'$who
     14 
     15 #############################
     16 #确定所有终端登录时间
     17 ############################
     18 #将shell变量传给awk,变成awk的变量
     19 #w | awk -v w="$(whoami)" 'w==$1 {print $1 "	" $2 "	" $3 "	" $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:	'$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:	' $NowM
     32 #echo 'nowtime_h:	' $nowtime_h
     33 #echo 'nowtime_m:	' $nowtime_m
     34 #echo 'nowtime_m-:	' $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:	'$LogM
     41 #echo 'AllLoginTime_h:	' $AllLoginTime_h
     42 #echo 'AllLoginTime_m:	' $AllLoginTime_m
     43 echo ''now you have logined $(($NowM-$LogM)) mintues''
  • 相关阅读:
    STL--string
    vector的常用总结
    poj 3279
    湖南省第八届大学生程序设计大赛原题 J
    湖南省第八届大学生程序设计大赛原题 E
    湖南省第八届大学生程序设计大赛原题 C
    湖南省第八届大学生程序设计大赛原题 B
    湖南省第八届大学生程序设计大赛原题 A
    湖南省第八届大学生程序设计大赛原题 D
    hdu1557
  • 原文地址:https://www.cnblogs.com/Aiapple/p/4951053.html
Copyright © 2011-2022 走看看