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''
  • 相关阅读:
    LC.225. Implement Stack using Queues(using two queues)
    LC.232. Implement Queue using Stacks(use two stacks)
    sort numbers with two stacks(many duplicates)
    LC.154. Find Minimum in Rotated Sorted Array II
    LC.81. Search in Rotated Sorted Array II
    LC.35.Search Insert Position
    前后端分离:(一)
    Redis基本使用(一)
    GIT篇章(二)
    GIT篇章(一)
  • 原文地址:https://www.cnblogs.com/Aiapple/p/4951053.html
Copyright © 2011-2022 走看看