代码改变世界

SHELL编程脚本笔记

2013-05-21 08:50  夏洛克·福尔摩斯  阅读(416)  评论(0编辑  收藏  举报
  • 利用特殊文件/dev/null(只写文件),清空apache2日志文件(文件大小变成0,但文件仍然存在).   当apache2的日志文件很大时,利用这条Script脚本定时清空日志文件,把清除指令写入clearlog.shècp /dev/null /var/log/apache2/access.log  。要其定期执行采用下列命令: chmod +x /root/clearlog.sh  crontab –u root –e 在VI 中填入: 0 6 * * * /root/clearlog.sh ,这样每天清晨六点自动执行clearlog.sh,自动清理log文件。
  • Bash Shell可以让我们把原本输出到屏幕的信息,重新指定到别的文件, 用例:echo ‘hello world’>hi.txt  由Bash开启一个新文件hi.txt来存储。存成文件后,只要使用cat、more、less等指令,就可以显示文件的内容。Cat hi.txt  more hi.txt  less hi.txt。转向附加到hi.txt èecho ‘hello world again!’>>hi.txt  查看hi.txt内容:hello world hello world again!
  • Echo  echo –e “I come from china \nwhat’s your name?” 选项-e,可让字符串中的特殊的字符有作用,例如:\n会被解释成换行字符,因此,上式会在china 后面产生换行效果。
  • 把字符串显示出来,通过管道交给tr,把大写字母转换成小写:printf“%s\n” “ABCDEFG” | tr ‘[A-Z] ‘  ‘[a-z]’.
  • 显示过去曾经执行过的Shell 指令:history。
  • 显示root 的历史脚本文件:echo $HISTFILE  历史指令最大容量查询:echo $HISTFILESIZE 查询显示的历史脚本文件内容:cat  .bash_history.
  • 列出登录主机之后,最近执行过的命令: fc –l  ;  fc –l 497 499 :列出编号之间的历史命令。
  • Read可以一次性读取一行数据放入数组中:read –a arr <  <(ehco 123 45 97 101 88) ,提取数值的方式:echo ${arr[2]}.
  • Cd 命令:cd == cd ~ 回到主目录。     Cd — 回到先前的目录。Cd.. 回到上一层目录。
  • Mkdir 建立新目录,mkdir –p /home/xl/var/log/apache ,如果不存在var/log/apache 则通过-p命令会建立此目录序列。在apache中建立文档,touch access.log 命令。删除目录:rmdir apache 删除文件:rm access.log。
  • 对文本文件进行排序 :sort –r sorted.txt :对sorted.txt 文件做降序排列。 Sort –n sorted.txt :对sorted.txt 文件做升序排列。
  • 对已排序好的文件删除重复行: sort sorted.txt | uniq:执行结果è删除文件中的重复行。 Sort sorted.txt | uniq –d:执行结果è挑出重复行。Sort sorted.txt | uniq –c:执行结果è计算每一行重复的次数。
  • 对文件的每一行抽出每一部分:cut 命令:cut –c2 sorted.txt:执行结果è抽出文件中每一行的第二个字符。Cut –c3-10 sorted.txt:执行结果è抽出文件中每一行的第3到第10个字符。Cut –d: -f1 /etc/passwd 执行结果è抽出/etc/passwd各行的第一个字段。(-d:指示cut改用:为分隔符,-f1是第一个字段之意。实例:cut –d: -f3,4 /etc/passwd è抽出文件各行的第3及第4个字段)。
  • 对文件以行和行的方式合并:paste命令:paste –d’#’ test.txt text1.txt:执行结果ètest.txt的每一行和text1.txt 的每一行合并,并以#分隔。 Paste –s sorted.txt :sorted.txt的每一行自己合并在一起,默认以Tab分隔。
  • 转换或删除字符命令:tr 命令:   tr k  K <test.txt :将test.txt中的k转换成K字符。 tr ‘[a-z]’ ‘[A-Z]’ <test.txt :将小写字母全换成大写字母。
  • 显示符合样式的行:grep命令:grep the  test.txt :显示the字符在test.txt文件中。
  • Tee 命令:读取标准输入,然后由标准输出显示,并且把这些数据存储在指定的文件。Tee test.log : 执行文本文件,test.log若已存在,会被清空,若不存在,则会建立一个新文件。欲结束输入,请按【ctrl+D】组合键。输入的数据存储在test.log。tee –a test.log,以文件附加的方式,把输入的数据接在test.log的文件尾,并不会把test.log清空。
  • 记录命令的执行过程:Script 指令把执行命令所产生的信息记录下来,存放在log.txt。
  • 建立字符设备文件:以下指令,可建立一个和/dev/null 相同属性的字符设备文件:mknod –m 666 nullfile c 1 3 ,如果/dev/null不慎丢失,可以这样重新建立/dev/null:mknod –m 666 /dev/null c 1 3。
  • 建立FIFO文件:mknod myfifo p ,在一个SHELL环境中使用echo命令,把一个字符串输出到myfifo,称为先进入者,而echo会暂停下来,等待其他进程读取数据,,,,在另一个shell环境中,使用cat命令读取来自myfifo的输出,称为先取出,而之前的echo指令则因数据已输出完毕而结束执行。
  • 建立Socket文件,Mksock mysocket。 在/dev中有一个重要的文件,如果不慎丢失,可利用mksock重建:mksock /dev/log  chmod 666  /dev/log
  • 建立符号链接文件,建立新的符号链接文件:Ln  –s  test.txt  tfile ,删除原符号链接文件,重建新的符号链接文件:ln –sf  test.txt  tfile,如果tfile 原已存在,则先予以删除,在建立一个新文件指向test.txt。建立指向目录的链接文件:ln –s  /root/tmp  mytmp,建立目录链接后,使用cd mytmp,就等价于cd /root/tmp。
  • 取得文件的属性:stat 的基本语法:取得文件系统的信息:stat  -f /dev/tty  。  取得文件的属性: stat   test.txt 。在文件系统中,文件还可以拥有一组特殊的属性,这些特殊的属性,可使用chattr 和lsattr 进行管理。Chattr用来改变文件的属性,lsattr则用来查看属性。Chattr 的使用方法:增加特殊属性:chattr  +属性代码 文件 设定特殊属性:chattr  + 属性代码  文件 。 删除特殊属性:chattr  —属性代码 文件 。代码:i 属性作用:不能修改文件 操作者的身份:只有root可以。设定取用文件后,取用时间不会变:chattr +A test.txt ,也可以直接指定属性,但原来的属性会被消除,只剩下属性A ,chattr =A test.txt 。使用lsattr 可以查看修改的结果:lsattr test.txt。例:配置文件不能修改:chattr  +i   test.txt 删除属性i 的方法:chattr  -i test.txt。
  • Shell 默认变量:$#:传入脚本的命令行参数的个数             $*:所有命令行参数值,在各个参数值之间留有空格  $0:命令本身(shell文件名)  $1:第一个命令行参数  $2:第二个命令行参数

例子:

 

执行情况如下:

 

 

 

  • 局部变量:在变量首次被赋值时加上Local关键字可以声明一个局部变量:

 

输出结果:

 

 

  • 变量(注意):变量赋值时,“=”左右两边都不能有空格
  • BASH中的语句结尾不需要分号
  • 判断:-e 文件已经存在  -f 文件是普通文件  -s 文件大小不为零 –d 文件是一个目录 –r 文件对当前用户可以读取 –w 文件对当前用户可以写入 –x文件对当前用户可以执行           

执行后:

 

第二种情况:

 

 

  • FOR循环:

 

执行后的结果:

 

第二种情况:

 

执行结果:

 

  • While循环:

 

执行结果:

 

  • 编写脚本,将用户输入的数字按照倒序输出:

 

执行结果:

 

 

升级版:

 

 

  • 统计当前目录的文件数:

Counter=0

For files in *

do

Counter=$((  $counter+1 ))

Done

Echo “there are $counter files in `pwd` we need to process”

 

升级版:

 

./bing.sh  /home     ./bing.sh  /root  è 查询想要得到目录的文件数目

  •