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