在Shell的世界中,有许多美妙的故事。小采风利用端午节前的时间,温习了曾经拜读过的《Linux命令行与shell脚本编程大全》和《Linux Shell脚本攻略》,虽然还是有部分章节存在疑惑,未能参透其中奥秘。回家日子前夕,争取做到温故而知新。
谈到Linux,在头脑中冒出的词汇有,文件、用户、权限、系统、进程及网络等。其命令及参数的复杂,会让人有雾里看花的迷离,有句话是说,每一个系统维护人员,都有自己的一套命令,也是蛮有道理的。下面的内容是在Ubuntu16.04上面的操作,不同的系统会有所差异。
Linux常用命令
用户:useradd userdel usermod groupadd groupmod
权限:umask chmod chown chgrp
进程:ps pgrep top kill killall trap
系统:which whereis file whatis uptime time df du who logrotate
文件 : cat ls more less head tail touch mkdir rmdir rm mv cp sed awk
Linux中一切皆文件,这些文件由多用户管理和操作,权限是区别用户对于文件使用能力衡量。作为系统管理者,对于系统、进程以及网络的熟知,更是值得学习和深入,没有什么诀窍,业精于勤荒于嬉。【你想要的命令都在这里】(http://man.linuxde.net )
下面记录一些常用的shell脚本,便于复习和进步:
一、计算斐波那契数列
#! /bin/bash
# count factorial
fact=1
for (( number=1 ; num<=$1 ; num++ ))
do
fact=$[ $fact * $number ]
done
echo "The factorial of $1 is $fact "
二、检查单词是否在指定的字典中
#! /bin/bash
word=$1
# -q字段,表示不再有任何输出
grep "^$1$" /usr/share/dict/american-english -q
if [ $? -eq 0 ]
then
echo "$1 is in dictory"
else
echo "$1 is not in dictory"
fi
三、重定向
Shell中最多有9个可以打开的文件描述符,0为标准输入,1为标准输出,2为标准错误输出,3到8为用户自定义使用,可以作为输入和输出,一起温习下面的脚本文件。
#!/bin/bash
exec 2>testerr
echo "The weather is bad"
exec 1>testout
echo "God blessing you."
echo "It is my fault." >&2
# 重定向:weather输出到屏幕上,God输出到文件testout中,It输出到testerr文件中
# >&2:输出到文件描述符2所在的位置
#!/bin/bash
exex 3>&1
exec 1>out
echo "Hello XiDian" >&3
echo "Hello World"
exec 1>&3
echo "Welcome"
#重定向恢复:XiDian输出到屏幕上,World输出到out文件中,Welcome输出到屏幕上
# 1>&3:将文件描述符1所在的位置重定向到文件描述符3所在的位置
#!/bin/bash
exec 3>test
echo "Nice to meet you." >&3
exec 3>&-
cat test
echo "Me,too" >&3
#重定向解除:Nice输出到test中,Me输出到test中,且覆盖前者
# 3>&-:解除文件描述符3的重定向
四、信号捕捉
#!/bin/bash
trap "echo 'Sorry,it is my fault.'" SIGINT
echo "This is a test about command trap $$"
count=1
while [ $count -le 10 ]
do
echo "The value is $count"
sleep 2
let count++
done
#运行时,按下ctrl+c发送SIGINT信号时,打印出fault语句,如果没有trap语句,进程直接关闭;
#filename & 运行在后台,会输出到前台,造成屏幕混乱,终端关闭后,方可停止
#nohup filename &将输出输入到nohup.out文件中,终端关闭,不会造成影响
#脚本以前台方式运行,接收信号,脚本有处理方式,脚本处理,无则本机处理;
#脚本以后台方式运行,输出在屏幕,且不接收信号,终端关闭则关闭;
#使用nohub后,即使终端关闭,不影响运行;
五、批量重命名
#!/bin/bash
count=1
for img in *.jpg *.png
do
#基于贪婪模式从左向右寻找$img变量中的后缀名
new=image-$count.${img##*.}
mv $img $new 2>/dev/null
#判断上一个命令是否成功
if [ $? -eq 0 ]
then
echo "Rename $img to $new"
let count++
fi
done
#将所有的jpg和png格式的图片,转换成类似于image-1.jpg或者image-2.png名字
#ls -al > /dev/null 将输出置为空
#cat /dev/null > filename 将filename置为空
六、列举文件信息
#!/bin/bash
if [ $# -ne 1 ]
then
echo $0
fi
# 声明关联数组
declare -A filearray
while read line
do
#只列出每行的文件信息,不包含文件名
ftype=`file -b $line`
let filearray["$ftype"]++
done
# 统计当前文件夹及文件的信息
七、10条历史常用命令
#!/bin/bash
printf "command\tcount\n"
cat ~/.bash_history | awk '{list[$1]++} \
END {
for ( i in list ){
printf("%s\t%d\n",i,list[i]);
}
}' | sort -nrk 2 | head
# 列举出单个用户的常用10条历史记录
# awk:强文本操作工具 sort -k:按照指定列排序
八、列出1小时内占用CPU常用资源的进程
#!/bin/bash
SECOND=3600
UNIT=60
STRP=$(( $SECOND / $UNIT ))
for (( i=0; i<$STEP; i++))
do
# 列出命令和使用cpu的时间,从第二行开始输出,追加方式开始输出
ps -eo comm,pcpu | tail -n +2 >>/tmp/cpu_usage.$$
sleep 2
done
echo CPU_USAGE:
cat /tmp/cpu_usage.$$ | awk ' \
{process[$1]+=$2; }
END{
for ( i in process ){
print $i,process[$i]
}
}' | sort -nrk 2 | head
# 输出1小时内占用CPU资源最多的10个进程
话说到这,暂时告一段落,不过还是有一点值得注意:
1 使用vim编辑器编写shell的时候,需要自动添加头部注释信息,一位简书的朋友,给出了详细的参考,【欢迎点击,vim自动补全shell】(http://www.jianshu.com/p/4b2e9c881f45 )
2 vim是一款强大的编辑工具,有许多常用的命令,【vim有你好看】(https://www.shiyanlou.com/courses/2 )
业精于勤荒于嬉,shell的世界确实很精彩,休息片刻,端午节后见。