当前位置:文档之家› 常用shell脚本指令

常用shell脚本指令

常用shell脚本命令1、显示包含文字aaa的下一行的内容:sed -n '/aaa/{n;p;}' filename2、删除当前行与下一行的内容:sed -i '/aaa/{N;d;}' filename3、删除当前行与下两行的内容:sed -i '/aaa/{N;N;d;}' filename依次类推,删除三行,则为{N;N;N;d;},分析知:N为next4、得出以空格为分割的字符串中单词的个数,即统计个数:awk ' { print NF } '如显示字符串VALUE中的单词个数,其中VALUE为:aaa bbb ccc ddd ee f则执行 echo $VALUE | awk ' { print NF } ' 后的结果为65、在linux中建立一个文件与另一文件的链接,即符号链接ln -s /var/named/chroot/etc/named.conf named.conf这要就建立了当前目录的文件named.conf对/var/named/chroot/etc/named.conf 的符号链接。

即操作named.conf就意味着操作实际文件/var/named/chroot/etc/named.conf ,这时用ll命令查看的结果如:lrwxrwxrwx 1 root root 32 Mar 22 12:29 named.conf ->/var/named/chroot/etc/named.conf注意:当用sed来通过named.conf来删除一部分信息时,会将符号链接的关系丢掉,即会将named.conf变成一个实际文件。

所以需对实际文件进行删除操作。

6、显示指定字符范围内的内容:如:显示文件test.txt中字符#test begin与#test end之间所有的字符sed -n "/#test begin/,/#test end/p" test.txt或 awk "/#test begin/,/#test end/" test.txt在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则.1. 单引号和双引号的区别单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符,不会作变量的引用,直接输出字符窜。

请看如下例子:[root@linux ~]# name=HaHa[root@linux ~]# echo $nameHaHa[root@linux ~]# myname="$name is wow"[root@linux ~]# echo $mynameHaHa is wow[root@linux ~]# myname='$name is wow'[root@linux ~]# echo $myname$name is wow从上面例子可以看出,使用了单引号的时候,那么$name只是普通字符,直接输出而已!2. 逐行读取文件∙使用for循环来读取文件for line in `cat file.txt`doecho $linedone注意:由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,如果行里有空格的时候,输出的结果会很乱,所以只适用于行连续不能有空格或者换行符的文件∙使用while循环读取文件cat file.txt |while read linedoecho $linedone或者:while read linedoecho $linedone < file.txt注意:由于使用while来读入文件里的行时,会整行读入,不会关注行的内容(空格..),所以比for读文件有更好的适用性,推荐使用while循环读取文件3. bash shell 脚本中常用隐含变量中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)$$ 变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。

$* 和 $@ 如果输出是一样的,但是在使用for循环,在使用双引号("")引用时"$*" 会输出成一个元素而 "$@" 会按照每个参数是一个元素方式输出请看测试例子#cat test.sh#!/bin/shecho '"$@" output.....'for i in "$@"doecho $idoneecho '"$*" output ....'for i in "$*"doecho $idone输出结果#sh test.sh a b c d"$@" output.....abcd"$*" output ....a b c d从输出结果可以看出 "$*" 输出是一行而 "$@" 输出则是四行4. 变量内容的删除与替换我们在一些情况下,需要对变量中的字符窜进行查找删除或者替换,就需要使用下表列出的方法[root@linux ~]# exporttest_str="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin: /usr/bin:/root/bin"[root@linux ~]# echo ${test_str#/*kerberos/bin:}/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin5. 变量条件测试赋值在某些时刻我们需要‘判断’某个变量是否存在,若变量存在则将此变量值赋值给新的变量,若变量不存在则将其他值赋值给新的变量.[root@linux ~]# test_name=""[root@linux ~]# test_name=${test_name-root}[root@linux ~]# echo $test_name<== 因为 test_name 被设定为空字符窜!所以当然还是保留为空字符窜![root@linux ~]# test_name=${test_name:-root}[root@linux ~]# echo $test_nameroot <== 加上‘:’后若变量内容为空或者是未设定,都能够以后面的内容替换!基本上这种变量的测试也能够透过 shell script 内的 if...then... 来处理,不过通过上述提及的简单的方法来测试变量,是程序看起来更精简一些!6. shell 中分隔符 : 变量IFS 使用shell脚本中,如果使用for循环一个字符窜的话,默认使用空格来分割字符窜.还有前面所提到的使用for循环逐行读取文件内容时候,文件行中如果有空格的话输出的结果也会变乱.这个时候使用 IFS 变量来设置特定的字符窜分割符来,达到输出正确的目的.默认情况下 IFS 是使用<space><tab><newline>,空格 \t \n 来作为默认的分割符的.我们将前面使用for逐行读取文件的例子改进下就可以输出正确了,请看下面#!/bin/bashIFS_old=$IFS #将原IFS值保存,以便用完后恢复IFS=$’\n’ #更改IFS值为$’\n’for line in `cat file.txt`doecho $linedonefile.txt 文件内容如下[root@linux]$ cat file.txtsdfsdfsdfsdfssssss ssssss ssssss ssssssdfsdfsdfsdfsdf执行测试程序输出结果如下(正确输出)[root@linux]$ sh test.shsdfsdfsdfsdfssssss ssssss ssssss ssssssdfsdfsdfsdfsdf如果未设置IFS变量,使用默认的IFS变量值 ,输出结果如下[root@linux]$ sh test.shsdfsdfsdfsdfssssssssssssssssssssssssdfsdfsdfsdfsdf从以上测试程序输出结果,可以根据自己的需求来设定 IFS变量,在举一个例子如下:while IFS=: read userName passWord userID groupID geCos homeDir userShelldoecho "$userName -> $homeDir"done < /etc/passwd7. shell 数组的使用数组赋值方式:(1) array=(var1 var2 var3 ... varN)(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)(3) array[0]=var1arrya[1]=var2...array[n]=varN计算数组元素个数或者长度:(1) ${#array[@]}(2) ${#array[*]}了解了数组基础语法,举例说明,请看:#!/bin/bashNAMESERVERS=("." "." ".") # 得到数组长度tLen=${#NAMESERVERS[@]}# 循环数组for (( i=0; i<${tLen}; i++ ));doecho ${NAMESERVERS[$i]}done在看一个复杂一点的例子,将文件内容读取到数组中:#!/bin/bash# 设置IFS将分割符设置为换行符(\n)OLDIFS=$IFSIFS=$'\n'# 读取文件内容到数组fileArray=($(cat file.txt))# restore itIFS=$OLDIFStLen=${#fileArray[@]}# 循环显示文件内容for (( i=0; i<${tLen}; i++ ));doecho "${fileArray[$i]}"done8. 逻辑判断条件测试∙文件属性的判断#!/bin/bashecho "checks the existence of the messages file."echo -n "Checking..."if [ -f /var/log/messages ];thenecho "/var/log/messages exists."fiechoecho "...done."∙字符串比较if [ "$(whoami)" != 'root' ]; thenecho "You have no permission to run $0 as non-root user." exit 1;fi数值比较(整数)num=`wc -l work.txt`if [ $num -gt 150 ];thenecho "you've worked hard enough for today."echofi如果要查看详细的测试操作,可以查看man手册 man test如何用脚本实现分割文件CODE:[Copy to clipboard]如何查找日期为某一天的文件CODE:[Copy to clipboard]如何计算当前目录下的文件数和目录数CODE:[Copy to clipboard]如何只列子目录?CODE:[Copy to clipboard]如何实现取出文件中特定的行内容CODE:[Copy to clipboard]如何查找含特定字符串的文件CODE:[Copy to clipboard]如何列出目录树CODE:[Copy to clipboard]如何实现取出文件中特定的列内容CODE:[Copy to clipboard]在vim中实现批量加密CODE:[Copy to clipboard]$@等特定shell变量的含义CODE:[Copy to clipboard]如何使程序的执行结果同时定向到屏幕和文件CODE:[Copy to clipboard]如何用sendmail给系统所有用户送信CODE:[Copy to clipboard]如何查找某条命令的相关库文件CODE:[Copy to clipboard]如何使用host命令获得更多信息CODE:[Copy to clipboard]如何停止终端多个进程CODE:[Copy to clipboard]如何转存用户bash_history文件2009年04月28日Program, Shellshell技巧脚本shell常用技巧用自动导入函数的方法,可以在命令行下像执行命令一样快捷,而且速度快,占用资源少. 1,建立自己的函数库mkdir functionlib然后将常用的脚本改成函数的语法,如:function filename { command ; }将filename拷贝到functionlib中,2,修改环境文件,在/etc/profile中添加export FPATH=$HOME/functionlib3,重登录一下这样的话,你就可以随时用像ls那样运行你自己的filename”命令”而不需要用什么dot,sh,来运行你的函数/脚本啦~~如果在脚本中运行,可以在脚本顶部用#!/bin/sh##autoload filename //来自动导入函数.…filename //调用函数…用自动导入函数的方法,可以在命令行下像执行命令一样快捷,而且速度快,占用资源少. 1,建立自己的函数库mkdir functionlib然后将常用的脚本改成函数的语法,如:function filename { command ; }将filename拷贝到functionlib中,2,修改环境文件,在/etc/profile中添加export FPATH=$HOME/functionlib3,重登录一下这样的话,你就可以随时用像ls那样运行你自己的filename”命令”而不需要用什么dot,sh,来运行你的函数/脚本啦~~如果在脚本中运行,可以在脚本顶部用#!/bin/sh##autoload filename //来自动导入函数.…filename //调用函数…技巧:pkill的妙用——————————————————————————–有的时候有很多进程或运行或睡眠或僵死,占用了很多宝贵的内存空间,kill固然可以杀掉某些进程,但更好的方法是用pkill,举例:代码:root//root>ps -APID TTY TIME CMD…1045 ? 00:00:00 kdeinit1052 ? 00:00:00 kdeinit1054 pts/0 00:00:00 xterm1056 pts/1 00:00:00 bash1082 pts/0 00:00:00 psroot//root>freetotal used free shared buffers cachedMem: 252340 212036 40304 0 5752 103200-/+ buffers/cache: 103084 149256Swap: 610460 0 610460root//root>pkill -9 xterm;free[1]+ Killed xtermtotal used free shared buffers cachedMem: 252340 210776 41564 0 5760 103200-/+ buffers/cache: 101816 150524Swap: 610460 0 610460在我杀掉了xterm这个进程后,看看你的free内存空间相应增加不少?.详细使用方法请:man pkill or pkill –help用stty和dd实现暂停,只须按一个键就可.#!/bin/ksh#function char {settty=$(stty -g)stty rawdd if=/dev/tty bs=1 count=1 2> /dev/nullstty -rawstty $settty}print “Press any key to continue…”input=$(char)技巧:如何检查用户的输入? ——————————————————————————–有的时候,我们对用户的输入要作必要的检测,如,限制输入的长度/类型.举例说明:代码:#!/bin/ksh#要求用户必须输入四个数字while truedoecho -n “请输入四个数字:”read numlen=${#num}#变量len存放输入的长度if [[ $num != [0-9][0-9][0-9][0-9] || $len != 4 ]] then#进行检测,如果你输入有非数字字符,或者长度不等于四个,便提示错误信息echo “错误! 重新输入”continueelseecho “输入正确,退出!”;exit 0fidone这是个例子,在我们编写脚本中可以借鉴shell变量传递给sed,awk,grep简单方法——————————————————————————–有时候在脚本编写中,需要往诸如awk等工具中传递shell的变量,举个简单的例子,如: ps -aux|sed -n 1pread input?”please field number your want to see:”ps -aux|awk ‘{print $”‘${input}’”}’read enter?”please line number your want to see:”ps -aux|sed -n ${enter}pread user?”please username your want to see:”ps -aux|grep $user注:上述文件无实际意义,只为说明而已.开启小键盘数字灯的方法——————————————————————————–在man setleds的描述中,有一段设置字符控制台数字灯的脚本:代码:INITTY=/dev/tty[1-8]for tty in $INITTYdosetleds -D +num < $ttydone把它放在/etc/rc.d/rc.local文件中即可!这样就可以像WIN一样一启动系统,它的小键盘的数字灯总是打开的!在字符模式下,也可以这样:setleds -D +num/+caps/+scroll技巧:把输入的密码变成*号的方法-------------------------------------------------------------------------------- 注:此贴转自:代码:#!/bin/shgetchar() {stty cbreak -echodd if=/dev/tty bs=1 count=1 2> /dev/nullstty -cbreak echo}printf “Please input your passwd: ”while : ; doret=`getchar`if [ -z $ret ]; thenechobreakfistr=”$str$ret”printf “*”doneecho “Your password is: $str”技巧:数值转换——————————————————————————–代码:#!/bin/bash#scriptname:conver#在BASH下简单实现十进制到二进制和十六进制的转换cat<技巧:统计文本中单词数量的方法——————————————————————————–有些单词在一篇文章中经常会出现很多次,怎么统计这个单词的个数呢?!如:文件kshfile,统计shell这个单词的个数,$cat kshfilekshThe “Korn” shell, written by David Korn of AT&T Bell Labs (now Lucent). Written as a major upgrade to “sh”, it is compatible with it, but has many more internal commands for the most frequently used functions. It also incorporates most of the same features from tcsh which enhance interactive use (command line history recall etc.). This shell is now available on most systems. It was slowto gain acceptance because earlier versions were encumbered by AT&T licensing. $cat kshfile|tr ” ” ” “|grep -wc shell2技巧:显示文本奇数偶数的方法——————————————————————————–[javalee//home/javalee/myshell]cat tmpaaaaaaddddddkasdkfkkdjhasdjfdfddfkjsdfklklsasdfjklkas#显示文件tmp的奇数行的内容:[javalee//home/javalee/myshell]sed -n ‘1,$p;n’ tmpaaaaaakasdkfkkdfddfasdfjklkas#显示文件tmp的偶数行的内容:[javalee//home/javalee/myshell]sed -n ‘1,$n;p’ tmpdddddddjhasdjfkjsdfklkls技巧:倒读文本——————————————————————————–例如文章:$cat -n tmp1 abcdefgh2 1232342343 sjdfk234231,行号倒序:$cat -n tmp|tac #tac和cat很有趣吧~~3 sjdfk234232 1232342341 abcdefgh2,每行倒读:$cat tmp|revhgfedcba43243232132432kfdjs3,全部倒过来:$cat -n tmp|rev|tac32432kfdjs 3432432321 2hgfedcba 14,用sed也可以解决要求对sed有足够的理解)$cat -n tmp|sed ‘/ /!G;s/(.)(.* )/&21/;//D;s/.//’hgfedcba 1432432321 232432kfdjs 3技巧:把汉字转换成十六进制和二进制的方法——————————————————————————–命令行下,利用perl的unpack函数,可以将汉字巧妙的变成十六进制和二进制,如: [javalee//home/javalee/myshell]perl -le ‘print unpack(“B*”,”中”);’ #把汉字”中”转换成二进制1101011011010000[javalee//home/javalee/myshell]perl -le ‘print unpack(“H*”,”国”);’ #把汉字”国”转换成十六进制b9fa技巧:妙用watch命令实时观察内存变化——————————————————————————–在linux中,有一个很有趣的命令–watch,他的作用很有趣!他作用是以全屏幕方式重复地执行指定的命令,用户可以通过他了解命令的运行情况.如,我们要观察内存动态的变化,那么就可以:watch free这样就可以动态的观察内存中各个指标在指定时间内的变化啦~~,如要观察虚拟内存的变化,也可以通过打开另外一个终端,而不耽误当前终端的操作!:xterm -e watch -n 1 vmstat &这样就会弹出一个xterm,显示有关虚拟内存的情况.详细解释,请:watch –helpman watch技巧:用 tr 过滤文件[转贴]——————————————————————————–了解文本实用程序Jacek Artymiak(jacek@)自由作家和顾问2003 年 7 月没有人曾说过 sed 很容易–它确实不容易!但通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能。

相关主题