收藏 分享(赏)

常用shell脚本命令总结.doc

上传人:weiwoduzun 文档编号:2711985 上传时间:2018-09-25 格式:DOC 页数:36 大小:168.50KB
下载 相关 举报
常用shell脚本命令总结.doc_第1页
第1页 / 共36页
常用shell脚本命令总结.doc_第2页
第2页 / 共36页
常用shell脚本命令总结.doc_第3页
第3页 / 共36页
常用shell脚本命令总结.doc_第4页
第4页 / 共36页
常用shell脚本命令总结.doc_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、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中建立

2、一个文件与另一文件的链接, 即符号链接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来通

3、过 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脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可 以完成大部分功能了,也就

4、是 2/8原则.1. 单引号和双引号的区别单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符 ,不会作变量的引用,直接输出字符窜。请看如下例子:rootlinux # name=HaHa rootlinux # echo $name HaHa rootlinux # myname=“$name is wow“ rootlinux # echo $myname HaHa is wow rootlinux # myname=$name is wow rootlinux # echo $myname $name is wow 从上面例子可以看出,使用了单引号的时候,那么

5、$name 只是普通字符,直接输出而已! 2. 逐行读取文件 使用 for循环来读取文件 for line in cat file.txtdoecho $linedone注意:由于使用 for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,如果行里有空格的时候,输出的结果会很乱,所以 只适用于行连续不能有空格或者换行符的文件 使用 while循环读取文件 cat file.txt |while read linedoecho $linedone或者:while read linedoecho $linedone , 空格 t n 来作为默认的分割符的.我们将前面使用 for逐行读取文件

6、的例子 改进下就可以输出正确了,请看下面#!/bin/bashIFS_old=$IFS #将原 IFS值保存,以便用完后恢复IFS=$n #更改 IFS值为$nfor line in cat file.txtdoecho $linedonefile.txt 文件内容如下rootlinux$ cat file.txt sdfsdfsdfsdfssssss ssssss ssssss ssssssdfsdfsdfsdfsdf执行测试程序 输出结果如下(正确输出)rootlinux$ sh test.sh sdfsdfsdfsdfssssss ssssss ssssss ssssssdfsdfsdf

7、sdfsdf如果未设置 IFS变量,使用默认的 IFS变量值 ,输出结果如下rootlinux$ sh test.sh sdfsdfsdfsdfssssssssssssssssssssssssdfsdfsdfsdfsdf从以上测试程序输出结果,可以根据自己的需求来设定 IFS 变量,在举一个例子如下:while IFS=: read userName passWord userID groupID geCos homeDir userShelldoecho “$userName - $homeDir“done ; mergeecho “i=0“ ; mergeecho “while $i -l

8、t $pieces ;“ ; mergeecho “do“ ; mergeecho “ echo merge: $file.$i“ ; mergeecho “ if ! -f $file.$i ; then“ ; mergeecho “ echo merge: $file.$i missed“ ; mergeecho “ rm -f $file.merged“ ; mergeecho “ exit“ ; mergeecho “ fi“ ; mergeecho “ dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i“ ; mergeec

9、ho “ let i=$i+1“ ; mergeecho “done“ ; mergechmod u+x merge 如何查找日期为某一天的文件CODE:Copy to clipboard#!/bin/sh # The right of usage, distribution and modification is here by granted by the author. # The author deny any responsibilities and liabilities related to the code. # OK=0 A=find $1 -print if expr $3

10、 = 1 ;/dev/null ; then M=Jan ; OK=1 ; fi if expr $3 = 2 ;/dev/null ; then M=Feb ; OK=1 ; fi if expr $3 = 3 ;/dev/null ; then M=Mar ; OK=1 ; fi if expr $3 = 4 ;/dev/null ; then M=Apr ; OK=1 ; fi if expr $3 = 5 ;/dev/null ; then M=May ; OK=1 ; fi if expr $3 = 6 ;/dev/null ; then M=Jun ; OK=1 ; fi if e

11、xpr $3 = 7 ;/dev/null ; then M=Jul ; OK=1 ; fi if expr $3 = 8 ;/dev/null ; then M=Aug ; OK=1 ; fi if expr $3 = 9 ;/dev/null ; then M=Sep ; OK=1 ; fi if expr $3 = 10 ;/dev/null ; then M=Oct ; OK=1 ; fi if expr $3 = 11 ;/dev/null ; then M=Nov ; OK=1 ; fi if expr $3 = 12 ;/dev/null ; then M=Dec ; OK=1

12、; fi if expr $3 = 1 ;/dev/null ; then M=Jan ; OK=1 ; fi if expr $OK = 1 ; /dev/null ; then ls -l -full-time $A 2;/dev/null | grep “$M $4“ | grep $2 ; else echo Usage: $0 path Year Month Day; echo Example: $0 1998 6 30; fi 如何计算当前目录下的文件数和目录数CODE:Copy to clipboard# ls -l * |grep “-“|wc -l - to count fi

13、les # ls -l * |grep “d“|wc -l - to count dir 如何只列子目录?CODE:Copy to clipboardls -F | grep /$ 或者 alias sub = “ls -F | grep /$“(linux)ls -l | grep “d“ 或者 ls -lL | grep “d“ (Solaris)如何实现取出文件中特定的行内容CODE:Copy to clipboard如果你只想看 文件的前 5行,可以使用 head命令,如: head -5 /etc/passwd 如果你想查看文件的后 10行,可以使用 tail 命令,如: tail

14、-10 /etc/passwd 你知道怎么查看文件中间一段吗?你可以使用 sed命令 如: sed -n 5,10p /etc/passwd 这样你就可以只查看文件的第 5行到第 10行。如何查找含特定字符串的文件CODE:Copy to clipboard例如查找当前 目录下含有“the string you want find.“字符串的文件:$find . -type f -exec grep “the string you want find.” ; -print 如何列出目录树CODE:Copy to clipboard下面的短小的 shell 程序可以列出目录树, 充分利用了 se

15、d强大的模式匹配能力. 目录树形式如下: . -shellp -updates -wu-ftpd-2.4 | -doc | | -examples | -src | | -config | | -makefiles | -support | | -makefiles | | -man | -util 脚本如下:#!/bin/sh # dtree: Usage: dtree any directory dir=$1:-. (cd $dir; pwd) find $dir -type d -print | sort -f | sed -e “s,$1,“ -e “/$/d“ -e “s,/*/(/

16、*)$,-1,“ -e “s,/*/,| ,g“ 如何实现取出文件中特定的列内容CODE:Copy to clipboard我们经常会遇 到需要取出分字段的文件的某些特定字段,例如/etc/password 就是通过“:”分隔各个字段的。可以通过 cut命令来实现。例如,我们希望将系统 账号名保存到特定的文件,就可以:cut -d: -f 1 /etc/passwd ; /tmp/users-d 用 来定义分隔符,默认为 tab键,-f 表示需要取得哪个字段。当然也可以通过 cut取得文件中每行中特定的几个字符,例如:cut -c3-5 /etc/passwd就是输出/etc/passwd 文

17、件中每行的第三到第五个字符。-c 和 f 参数可以跟以下子参数:N 第 N个字符或字段N- 从第一个字符或字段到文件结束N-M 从第 N个到第 M个字符或字段-M 从第一个到第 N个字符或字段 在 vim中实现批量加密CODE:Copy to clipboard密码中还是不 能带空格,不管了,能加密就好,先这么用着。=#!/bin/bash# Encrypt file with vimif (test $# -lt 2) thenecho Usage: decrypt password filenameelsevim -e -s -c “:set key=$1“ -c :wq $2echo “

18、$2 encrypted.“fi=weederSMTH weeder$ for file in *.txt ; do encrypt test $file ; donetest2.txt encrypted.test4.txt encrypted.test9.txt encrypted.kick.txt encrypted.echo “$2 encrypted.“fiweederSMTH weeder$ for file in *.txt ; do encrypt test $file ; donetest2.txt encrypted.test4.txt encrypted.test9.tx

19、t encrypted.kick.txt encrypted.too_old.txt encrypted.too_old_again.txt encrypted.bg5.txt encrypted.weederSMTH weeder$ $等特定 shell变量的含义CODE:Copy to clipboard在 shell 脚本的实际编写中,有一些特殊的变量十分有用:$# 传递到脚本的参数个数$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过 9个$ 脚本运行的当前进程 ID号$! 后台运行的最后一个进程的进程 ID号$ 与$#相同,但是使用时加引号,并在引号中返回

20、每个参数$- 显示 shell使用的当前选项,与 set命令功能相同$? 显示最后命令的退出状态。0 表示没有错误,其他任何值表明有错误。如何使程序的执行结果同时定向到屏幕和文件CODE:Copy to clipboardprogram_name |tee logfile这样程序执行期间的显示都记录到 logfile同时显示到标准输出(屏幕)。 如何用 sendmail给系统所有用户送信CODE:Copy to clipboard首先在 aliases 文件里面建立一个 alias:alluser: :include:/etc/mail/allusers并执行 newaliases 使之生效,

21、然后在/etc/mail/allusers 里面列出所有用户,可以使用下面的命令:awk -F: $3 ; 100 print $1 /etc/passwd ; /etc/mail/allusers如何查找某条命令的相关库文件CODE:Copy to clipboard在制作自己的 发行版时经常需要判断某条命令需要哪些库文件的支持,以确保指定的命令在独立的系统内可以可靠的运行。在 Linux环境下通过 ldd命令即可实 现,在控制台执行:ldd /bin/ls即可得到/bin/ls 命令的相关库文件列表。 如何使用 host命令获得更多信息CODE:Copy to clipboardHost能

22、够 用来查询域名,然而它可以得到更多的信息。host -t mx 可以查询出 L的MX记录,以及处理 Mail的 Host的名字。Host -l 会返回所有注册在 下的域名。host -a 则会显示这个主机的所有域名信息。 如何停止终端多个进程CODE:Copy to clipboard以下是脚本:echo “系统当前用户“echo “-“who | awk print $2echo “-“echo “输入要杀死终端的终端号:“read $TTYkill -9 $K=ps -t $TTY | grep 0-9 | awk print $1 如何转存用户 bash_history文件# 把以

23、下代码添加到/etc/profile 文件内export HISTTIMEFORMAT=“%F %T “ USER_IP=who -u am i 2/dev/null| awk print $NF|sed -e s/()/g LOCAL_name=hostname HISTDIR=/var/log/.hist/$LOCAL_name_date +%Y%m%d_auditlog # 判断$USER_IP 是否为空,如果为空则使用 hostname记录. if -z $USER_IP then USER_IP=hostname fi if ! -d $HISTDIR then mkdir -p $

24、HISTDIR # 为$HISTDIR 赋值权限,让所有用户都可以访问. chmod 777 $HISTDIR fi if ! -d $HISTDIR/$LOGNAME then mkdir -p $HISTDIR/$LOGNAME chmod 300 $HISTDIR/$LOGNAME fi export HISTSIZE=4096 DT=date +%Y%m%d“_“%T export HISTFILE=“$HISTDIR/$LOGNAME/$USER_IP_$LOGNAME_$DT“ chmod 600 $HISTDIR/$LOGNAME/*.hist* 2/dev/null2009年

25、04月 28日 Program, Shellshell 技巧 脚本shell常用技巧用自动导入函数的方法,可以在命令行下像执行命令一样快捷,而且速度快,占用资源少.1,建立自己的函数库mkdir functionlib然后将常用的脚本改成函数的语法,如:function filename command ; 将 filename拷贝到 functionlib中,2,修改环境文件,在/etc/profile 中添加export FPATH=$HOME/functionlib3,重登录一下这样的话,你就可以随时用像 ls那样运行你自己的 filename”命令”而不需要用什么 dot,sh,来运行

26、你的函数/脚本啦如果在脚本中运行,可以在脚本顶部用#!/bin/sh#autoload filename /来自动导入函数.filename /调用函数用自动导入函数的方法,可以在命令行下像执行命令一样快捷,而且速度快,占用资源少.1,建立自己的函数库mkdir functionlib然后将常用的脚本改成函数的语法,如:function filename command ; 将 filename拷贝到 functionlib中,2,修改环境文件,在/etc/profile 中添加export FPATH=$HOME/functionlib3,重登录一下这样的话,你就可以随时用像 ls那样运行你

27、自己的 filename”命令”而不需要用什么 dot,sh,来运行你的函数/脚本啦如果在脚本中运行,可以在脚本顶部用#!/bin/sh#autoload filename /来自动导入函数.filename /调用函数技巧:pkill 的妙用 有的时候有很多进程或运行或睡眠或僵死,占用了很多宝贵的内存空间,kill 固然可以杀掉某些进程,但更好的方法是用 pkill,举例:代码:root/rootps -APID TTY TIME CMD1045 ? 00:00:00 kdeinit1052 ? 00:00:00 kdeinit1054 pts/0 00:00:00 xterm1056 pt

28、s/1 00:00:00 bash1082 pts/0 00:00:00 psroot/rootfreetotal used free shared buffers cachedMem: 252340 212036 40304 0 5752 103200-/+ buffers/cache: 103084 149256Swap: 610460 0 610460root/rootpkill -9 xterm;free1+ Killed xtermtotal used free shared buffers cachedMem: 252340 210776 41564 0 5760 103200-/

29、+ 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 $setttyprint “Press any key to continue”input=$(char)

30、技巧:如何检查用户的输入? 有的时候,我们对用户的输入要作必要的检测,如,限制输入的长度/类型.举例说明:代码:#!/bin/ksh#要求用户必须输入四个数字while truedoecho -n “请输入四个数字:”read numlen=$#num#变量 len存放输入的长度if $num != 0-90-90-90-9 | $len != 4 then#进行检测,如果你输入有非数字字符,或者长度不等于四个,便提示错误信息echo “错误! 重新输入”continueelseecho “输入正确,退出!”;exit 0fidone这是个例子,在我们编写脚本中可以借鉴shell变量传递给 s

31、ed,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 $enterpread user?”please username your want to see:”ps -aux|grep $user注:上述文件无实际意义

32、,只为说明而已.开启小键盘数字灯的方法 在 man setleds的描述中,有一段设置字符控制台数字灯的脚本:代码:INITTY=/dev/tty1-8for tty in $INITTYdosetleds -D +num /dev/nullstty -cbreak echoprintf “Please input your passwd: ”while : ; doret=getcharif -z $ret ; thenechobreakfistr=”$str$ret”printf “*”doneecho “Your password is: $str” 技巧:数值转换 代码:#!/bin/

33、bash#scriptname:conver#在 BASH下简单实现十进制到二进制和十六进制的转换cat UNIX:tr unixfileUNIX - Mac:tr macfileMicrosoft DOS/Windows 约定,文本的每行以回车字符并后跟换行符结束。为了纠正这个问题,可以使用下列命令: DOS - UNIX:tr -d unixfileUNIX - DOS:在这种情况下,需要用 awk,因为 tr 不能插入两个字符来替换一个字符。要使用的 awk 命令为 awk print $0 ” dosfile另外,当您需要对文本文件做一些简单的整理工作(如用 tr -d 除去制表符,用

34、 tr -s 除去多余的空格,或者用 tr -d 将分开的几行合成一行)时,会需要用 tr。同样,可以在 vi 内使用所有这些命令;只要记住:在 tr 命令前要加上您希望处理的行范围和感叹号(!),如 1,$!tr -d (美元符号表示最后一行)中所示。 技巧:删除文件中空行的几种方法 1,cat filename|tr -s 2,sed /$/d filename3,awk if($0!=”“)print filename4,用 grep也可以,但是比较麻烦技巧:如何判断输入的是字符还是数字的三个方法 1,用输入的字符串和任意一个数字进行运算,可以判断!代码:#!/bin/ksh#var=$

35、(echo “$1*1|bc)if $var != 0 thenecho “$1 is a number”elseecho “$1 is a charter”fi 2,用流编辑器 sed!代码:if -n “echo $1|sed -n /0-90-9*$/p” thenecho “$1 is number!”elseecho “$1 is not number!”fi3,用 awk来判断!代码:echo $1|awk if($0/0-9/) print “$1 is not number” elseprint “$1 is number”技巧:用 uniq 除去重复行转 作者:Jacek A

36、rtymiak()自由作家和顾问 2003 年 7 月重复行通常不会造成问题,但是有时候它们的确会引起问题。此时,不必花上一个下午的时间来为它们编制过滤器,uniq 命令便是唾手可得的好工具。了解一下它是如何节省您的时间和精力的。进行排序之后,您会发现有些行是重复的。有时候该重复信息是不需要的,可以将它除去以节省磁盘空间。不必对文本行进行排序,但是您应当记住 uniq 在读取行时会对它们进行比较并将只除去两个或更多的连续行。下面的示例说明了它实际上是如何工作的:清单 1. 用 uniq 除去重复行$ cat happybirthday.txtHappy Birthday to You!Happ

37、y Birthday to You!Happy Birthday Dear Tux!Happy Birthday to You!$ sort happybirthday.txt Happy Birthday Dear Tux!Happy Birthday to You!Happy Birthday to You!Happy Birthday to You!$ sort happybirthday.txt | uniqHappy Birthday Dear Tux!Happy Birthday to You!警告:请不要使用 uniq 或任何其它工具从包含财务或其它重要数据的文件中除去重复行。在

38、这种情况下,重复行几乎总是表示同一金额的另一个交易,将它除去会给会计部造成许多困难。 千万别这么干!有关 uniq 的更多信息本系列文章介绍了文本实用程序,它对在手册页和信息页找到的信息作了补充。如果您打开新的终端窗口并输入 man uniq 或 info uniq,或者打开新的浏览器窗口并查看位于 gnu.org 的 uniq 手册页,那么就可以了解更多的相关信息。如果您希望您的工作轻松点,比如只显示唯一的或重复的行,那么该怎么办呢?您可以用 -u(唯一)和 -d(重复)选项来做到这一点,例如:清单 2. 使用 -u 和 -d 选项$ sort happybirthday.txt | uni

39、q -uHappy Birthday Dear Tux!$ sort happybirthday.txt | uniq -dHappy Birthday to You!您还可以用 -c 选项从 uniq 中获取一些统计信息:清单 3. 使用 -c 选项$ sort happybirthday.txt | uniq -uc1 Happy Birthday Dear Tux!$ sort happybirthday.txt | uniq -dc3 Happy Birthday to You!就算 uniq 对完整的行进行比较,它仍然会很有用,但是那并非该命令的全部功能。特别方便的是:使用 -f 选

40、项,后面跟着要跳过的字段数,它能够跳过给定数目的字段。当您查看系统日志时这非常有用。通常,某些项要被复制许多次,这使得查看日志很难。使用简单的 uniq 无法完成任务,因为每一项都以不同的时间戳记开头。但是如果您告诉它跳过所有的时间字段,您的日志一下子就会变得更加便于管理。试一试 uniq -f 3 /var/log/messages,亲眼看看。还有另一个选项 -s,它的功能就像 -f 一样,但是跳过给定数目的字符。您可以一起使用 -f 和 -s。uniq 先跳过字段,再跳过字符。如果您只想使用一些预先设置的字符进行比较,那么该怎么办呢?试试看 -w 选项。技巧:限时输入的实现 举例:代码:#

41、!/bin/kshstty -icanon min 0 time 100 filename2,用 here文档,如:Comment 1: 代码:/home/javalee#cat some strings!#CTR+D退出3,用 dd命令,如:代码:/home/javalee#dd filename 2/dev/null#CTR+D退出4,用 while循环,如:代码:/home/javalee#while read i;do echo $i filename;done#CTR+D退出5,用 read:如:代码:/home/javalee#while true;do read;echo $RE

42、PLY filename; -z $REPLY done技巧:用 grep提取网址/链接的方法 代码:grep -o http:/a-zA-Z0-9./?=%_* urlfile 感兴趣的话大家可以测试一下grep version:grep (GNU grep) 2.5.1grep对-o 选项的解释:-o, only-matching show only the part of a line matching PATTERN常用 shell脚本的使用shell, 脚本我在学习期间写过一些 shell脚本,现在整理出来,希望对刚学习 shell的朋友有点用处:测试过程:vi test.sh 后把

43、程序写入其中,保存退出。然后改变文件属性:chmod +x test.sh 最后执行:./test.shfor语句测试:1)#!/bin/bashfor num in 1 2 3doecho “hello,num=$num“done2)#!/bin/bashfor (i=1;i fortest.shsed 1,$s/is/-end/ fortest.shsed 1,$s/is/-end/g fortest.shsed /is/= fortest.sh引号测试:#!/bin/bashvar=helloecho “var is $var“echo var is $varecho “var is $

44、var“echo lsvar2=dateecho $var2case语句测试:#!/bin/bashfor ( ; )doecho “please input a key:“read wordcase $word in1)echo “your chioce is the one“;2)echo “your chioce is the two“;3)echo “your chioce is the three“;q)echo “your choice is exit“exit;*)echo “illegal choice“exitesacdone“ $ “符号测试:#!/bin/bashecho

45、 “please run with more than one parm“;echo “program name $0:“$0;echo “first param $1:“$2;echo “first param $:“$;echo “first param $*:“$*;数组的使用:#!/bin/bashhostip=(“100“,“101“,“102“,“103“,“104“,“105“,“106“,“107“,“108“,“109“,“110“)hostpass=(“123456“,“123456“,“123456“,“123456“,“123456“,“123456“,“123456“

46、,“123456“,“123456“,“123456“,“123456“)i=1while $i -lt 12 ; dossh root10.0.2.hostip$idone重启别人电脑的 shell: #这个好像有点问题,需再测试下#!/usr/bin/expectspawn ssh root10.0.2.120expect “password:“send “123456n“expect “$“send “rebootn“#expect “password:“#send “123456n“expect eof查找文件,需指定查找目录和文件的修改时间:#!/bin/bashpath=$1date=$2if -z $path then echo “Please input find path:(eg:/dev/abc/)“read pathfiif -z $date thenecho “Please input find date:(eg:2006-04-23)“read datefils -l $path -time-style=long-iso | grep

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 工作总结

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报