shell 命令

1 篇文章 0 订阅
1、脚本之间传递参数 "1.sh"的脚本,接受参数。如下,如果有一个参数则赋值个sourceFile这个变量,否则用默认值。 
Shell代码
  1.    
  2. #!/bin/bash   
  3. LANG=en_US.UTF-8   
  4. #get parameters   
  5. sourceFile="/data/log/abc"   
  6. if $# == 1   
  7.   then sourceFile=$1   
  8.   else echo "$1 required!"   
  9. fi   
  10. echo $sourceFile   

备注:这里$#是传递参数的个数,$1 是具体的参数。 

关于if else: 
如果两条命令写在同一行则需要用";"号隔开,一行只写一条命令就不需要写";"号了。和[命令一样,要注意命令和各参数之间必须用空格隔开。if命令的参数组成一条子命令,如果该子命令的Exit Status为0(表示真),则执行then后面的子命令,如果Exit Status非0(表示假),则执行elif、else或者fi后面的子命令。if后面的子命令通常是测试命令,但也可以是其它命令。Shell脚本没有{}括号,所以用fi表示if语句块的结束。 

"2.sh"的脚本,传递参数 
Shell代码
  1.    
  2. #!/bin/bash   
  3. sh 1.sh 参数1 参数2 ...   

备注:多个参数之间用空格符隔开。 

2、文件内容行之间的排序 
Shell代码
  1.    
  2. #!/bin/bash   
  3. sort -t= +4 文件 ”  

备注:“=”表示按=号进行切割(注意:只能是单个字符),“+4”表示按第五个项进行排序。 
更多参数: 
-r 表示降序排序 
-n 表示按数字大小排序 
-k 表示根据那个字段排序,4.1,表示第4列第一个字符开始 ,5表示到第5个字段为结束 
-t 后面跟分隔符,缺省是空格 
例如:sort -r -n -k4.1,5 


3、判断目录是否存在,没有则新建一个目录 
Shell代码
  1.    
  2. #!/bin/bash   
  3. dayDir="/home/logs/"   
  4. if -d "$dayDir"   
  5.   then mkdir "$dayDir" fi   


4、判断文件是否存在,有则删除 
Shell代码
  1.    
  2. #!/bin/bash   
  3. if -f "$FAIL_FILE"  
  4.   then   
  5.     rm -rf "$FAIL_FILE"   
  6.     echo `date`FILE IS EXISTS: "$FAIL_FILE   
  7. fi  


5、找出文件中的相关行 
Shell代码
  1.    
  2. #!/bin/bash   
  3. cat 文件 |grep -a "关键词" >> result.log   

备注:把文件中包含关键词的行输出到result.log中。 

6、文件切分 
Shell代码
  1.    
  2. #!/bin/bash   
  3. awk -F'' '{print $1}' 文件   

备注:“”表示分隔符,“print”表示换行输出(printf不换行),“$1”表示取第一项。“文件”表示要切分的文件 

7、文件内容排重 
Shell代码
  1.    
  2. #!/bin/bash   
  3. awk -F',' '!a[$1]++' test.txt   

备注:“,”表示按“,”号分隔;“$1”表示按第一项排重;“test.txt”表示要处理的文件。 

8、grep多个关键字 
Shell代码
  1.    
  2. #!/bin/bash   
  3. cat $file |grep -a "aop=keyword1\|keyword2"   

备注:多个关键字用“\|”分隔。 

9、时间格式化,中间有空格的需要加引号 
Shell代码
  1.    
  2. #!/bin/bash   
  3. TODAY=`date -d today '+%Y-%m-%d %H:%M:%S'  


10、多个文件合并 
Shell代码
  1.    
  2. #!/bin/bash   
  3. cat $FILE1 $FILE2 |grep -a "关键字" $MERGE_FILE   


11、运行java项目 
Shell代码
  1.    
  2. #!/bin/bash   
  3. LANG=en_US.UTF-8   
  4. export LANG=$LANG   
  5. /usr/java/latest/bin/java -cp -Djava.ext.dirs=../lib 包.类(含main方法) -a 参数1 -b 参数2   

备注:“/usr/java/latest/bin/java”表示Java环境,“-cp”表示classpath路径,“.”表示当前目录,“-Djava.ext.dirs”表示jar文件所在目录,“-a”表示参数名称,“参数1”表示参数值。 

12、根据关键字统计行数,赋值给变量 
Shell代码
  1.    
  2. #!/bin/bash   
  3. COUNT=$(cat $FILE |grep -a "关键字" |wc -l)   

备注:“$FILE”表示要统计的文件,“关键字”要包含的关键字,“wc”统计文件(-l行数,-w字数,-c字节数) 
wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。 
语法:wc [选项] 文件… 
说明:该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。 
该命令各选项含义如下: 
-c 统计字节数。 
-l 统计行数。 
-w 统计字数。 
这些选项可以组合使用。 输出列的顺序和数目不受选项的顺序和数目的影响。总是按下述顺序显示并且每项最多一列。 行数、字数、字节数、文件名 如果命令行中没有文件名,则输出中不出现文件名。 例如: $wc -lcw file1 file2 4 33 file1 7 52 file2 11 11 85 total 省略任选项-lcw,wc命令的执行结果与上面一样。 

13、基本算术计算的方法(5种) 
a. 使用awk计算  
Shell代码
  1.    
  2. #!/bin/bash   
  3. ##示例1:1012为两个参数分别对应$1和$2   
  4. echo 10 12 |awk '{printf("%d\n", $1+$2)}'   
  5.   
  6. ##示例2:a和b作为两个变量传入   
  7. a=10   
  8. b=12   
  9. echo |awk '{printf("%d\n", '$a'+'$b')}'   
  10.   
  11. ##示例3:COUNT_FAIL除以COUNT_INIT 保留4为小数,结果赋值给FAIL_INIT,[b]结果四舍五入[/b]。   
  12. COUNT_FAIL=10   
  13. COUNT_INIT=20 FAIL_INIT=`awk 'BEGIN{printf "%.4f\n",'$COUNT_FAIL'/'$COUNT_INIT'}'  
  14. echo $FAIL_INIT   

备注:示例2和示例3两种写法除数和被除数都要加“'”号(单引号),否则会报错“division by zero attempted”,另外“BEGIN”也很重要哦。 

b. 使用bc命令  
Shell代码
  1.    
  2. #!/bin/bash   
  3. ##示例1:输出 1+2 的运算结果   
  4. echo 1+2 |bc   
  5.   
  6. ##示例2:COUNT_FAIL除以COUNT_INIT 保留2为小数,结果赋值给FAIL_INIT,[b]结果不四舍五入[/b]。   
  7. FAIL_INIT=`echo "scale=2; $COUNT_FAIL/$COUNT_INIT" bc`   


c. 使用expr命令  
Shell代码
  1.    
  2. #!/bin/bash   
  3. count=10   
  4. count=`expr $count 12  
  5. echo $count   


d. 使用let命令  
Shell代码
  1.    
  2. #!/bin/bash   
  3. ##示例1   
  4. let num1=10*20   
  5. echo $num1   
  6.   
  7. ##示例2   
  8. let "num2=10*20"   
  9. echo $num2   


e. 加双括号  
Shell代码
  1.    
  2. #!/bin/bash   
  3. ##示例1:双小括号   
  4. a=12   
  5. b=20   
  6. echo $((a*b))   
  7. echo $(($a*$b))   
  8.   
  9. ##示例2:中括号   
  10. c=10   
  11. echo $[c*20  
  12. echo $[$c*20  

备注:此种写法括号里面的变量可以不用加“$”符号,但是括号外面的“$”符号一定要加上。 

14、运用tee命令将日志同时输出到多个文件 
tee用法功能说明:读取标准输入的数据,并将其内容输出成文件。 
语 法:tee [-ai][--help][--version][文件...] 
补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。 
参 数: 
-a或--append 附加到既有文件的后面,而非覆盖它. 
-i或--ignore-interrupts 忽略中断信号。 
-help 在线帮助。 
-version 显示版本信息。 
例1:日志在记入log1.txt和log2.txt的同时也在控制台输出 
Shell代码
  1.    
  2. #!/bin/bash   
  3. echo "hello jack!" |tee -a log1.txt log2.txt   

备注:“-a”追加,否则清空重写。 

15、针对某个域进行分组统计 
Shell代码
  1.    
  2. #!/bin/bash   
  3. cat $FILE |awk -F"" '{list[$11]++;}END{for (val in list) print val, list[val];}' |tee -a $RESULT_FILE   

备注:“$FILE”要处理的文件,用awk命令按“”进行切分,“$11”表示第11域(1,3,5,...),“var”表示分组名称,“list[var]”表示每组的数量。 

16、查询控制命令的历史记录 
Shell代码
  1.    
  2. #!/bin/bash history |grep "rm"   

备注:查询包含“rm”字符的命令记录。 

17、循环删除所有文件 
Shell代码
  1.    
  2. #!/bin/bash   
  3. for in `ls`; do rm $i; done   

备注:在文件非常多的情况下,rm * 命令不能删除所有文件。所以需要遍历删除每一个文件。 

18、遍历文件夹并按第二个域对文件内容排序。 
Shell代码
  1.    
  2. #!/bin/bash   
  3. #用等号分隔,按第二个域排序   
  4. function sortfile(){   
  5.    echo 'Processing: '$1 sort -t= +1 $1 $1'_temp'   
  6.    mv $1'_temp' $1   
  7.   
  8. #遍历文件夹,调用排序函数   
  9. function ergodic(){   
  10.   for file in `ls $1  
  11.   do   
  12.     if -d $1"/"$file   
  13.       then  
  14.         ergodic $1"/"$file   
  15.       else   
  16.         f=$1"/"$file   
  17.         #调用排序函数   
  18.          sortfile $f   
  19.      fi   
  20.   done  
  21.   
  22. #以参数形式运行程序   
  23. if $# == 1 ];   
  24.   then   
  25.     echo "parameter: "$1  
  26.     ergodic $1   
  27.   else   
  28.     echo "a file directory required!"   
  29. fi   


19、查看文件夹下所有文件数目和所有文件夹数目 
Shell代码
  1. #!/bin/bash   
  2. #查看当前文件夹下所有文件数目   
  3. find -type |wc -l   
  4.   
  5. #查看当前文件夹下所有文件夹数目   
  6. find -type |wc -l   

备注:“.”表示当前目录,可以换成其他路径。 

20、shell与java正则区别 
Java代码
  1. String regex "2010-11-08.+"   
  2. //或者 regex "2010-11-08.*"   

备注:JAVA中匹配以“2010-11-08"开头的字符串。 
Shell代码
  1.    
  2. regex "2010-11-08*"   

备注:SHELL中匹配以“2010-11-08”开头的字符串。 
“.*”或“.+”在java中表示任意多个字符串,如果要匹配“.”号,需要加转义“\”。 “*”在shell表示任意多个字符,加“.”或“+”号都会错误。 

21、编码转换命令 
Shell代码
  1. iconv -f gb2312 -t utf-8 a.log b.log  

备注:表示把a.log文件从gb2312编码转成utf-8的编码,并把文件写入b.log 

22、批量替换多个文件中的字符串 
Shell代码
  1. sed -i "s/<原始串>/<新串>/g" `grep <原始串> -rl <目标文件或目录>`  

备注: 
-i 表示inplace edit,就地修改文件 
-r 表示搜索子目录 
-l 表示输出匹配的文件名 

23、常用MySQL语句 
//查询mysql变量(timeout) 
show variables like '%timeout' 
//查询缓存变量 
show status like "Qcache%" 
//查询进程列表 
show PROCESSLIST 

24、清空memcache数据 
telnet 10.27.5.71 11211 
flush_all 
quit //退出telnet 

25、监控Tomcat并启动 
Shell代码
  1. #!/bin/sh  
  2.   
  3. export _JAVA_SR_SIGNUM=12  
  4. export JAVA_HOME=/usr/java/jdk1.6.0_11  
  5. export CATALINA_BASE=/home/co_newest_family/tomcat  
  6. export CATALINA_HOME=/usr/local/apache-tomcat-6.0.18  
  7. export LD_LIBRARY_PATH=:/usr/local/lib/:/usr/local/apr/lib/:/usr/local/apr/lib/  
  8. export CATALINA_OPTS="-server -Xms1024m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9158 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dfile.encoding=UTF8 -Dmeganotes.home=/home/co_newest_family"  
  9. export PATH=$JAVA_HOME/bin:$PATH:$HOME/bin  
  10.   
  11. date=`date "+%H:%M:%S" 
  12. message="$date|check_tomcat(81_co_newest_family)_shutdown_and_restart_it."  
  13. request_url="http://10.27.5.81:9091/index.jsp"  
  14.   
  15. if wget -t1 -T2 $request_url &> /dev/null;then  
  16.    #pid=`ps aux grep "\-Dcms4.home\=\/home\/co_newest_family\/"awk '{print $2}'         
  17.    #kill -9 $pid  
  18.    ps x|grep 'tomcat'|grep -v 'grep'|grep -v 'sh'|awk '{print $1}'|xargs kill -9  
  19.    $CATALINA_HOME/bin/startup.sh  
  20.    wget -t1 -T2 http://10.27.5.112:8880/send.jsp?msg=$message &> /dev/null;  
  21.    echo "$date check tomcat shutdown and restart it." >> logs/check.log  
  22. else  
  23.    echo "$date check tomcat ok." >> logs/check.log  
  24. fi  
  25.   
  26. rm -f index.jsp*  
  27. rm -f send.jsp?msg=*  

备注:定时监控tomcat,发现挂掉,立刻重启!并发送短信和邮件报告~ 
-t1 表示只请求一次 
-T2 表示2秒超时 

26、linux查找文件的一些方法 
1) 按文件名查找 
#在/opt目录及其子目录下查找包含文件名是以zhjedu开头的文件 
find /opt -name "zhjedu*"   

2) 按时间查找 
#在/opt目录及其子目录下查找最近1个小时修改的文件 
find /opt -mtime -1 
#在/opt目录及其子目录下查找1个小时以前修改的文件 
find /opt -mtime +1 

3)  按类型查找 
#在/opt目录及其子目录下查找目录及其子目录 
find /opt -type d 
#在/opt目录及其子目录下查找所有的普通文件 
find /opt -type f 

4) 按大小查找 
#在/opt目录及其子目录下查找文件大于10M的文件 
find /opt -size +10000k 

27、curl命令的用法 
参见1: http://blog.sina.com.cn/s/blog_62b832910100tyfi.html  
参见2: http://javag.iteye.com/blog/499113  

28、split切割大文件 
Shell代码
  1. split -l 10000 log1_6.log.2012-03-21 tt.txt  

备注:将log1_6.log.2012-03-21文件切割成10000行一个的以tt.txt开头的N多个文件 
-l 表示按行切割 
tt.txt 表示切割后的零碎文件的前缀 

29、循环读取行 
读取文件每行并输出 
方法一: 
Shell代码
  1. #!/bin/sh  
  2. while read line  
  3. do  
  4.       echo $line      
  5. done filename  

方法二: 
Shell代码
  1. #!/bin/sh  
  2. cat filename while read line  
  3. do  
  4.     echo $line  
  5. done  


30、删除数量比较多的文件 
Shell代码
  1. ls xargs -n 20 rm -rf  

ls当然是输出所有的文件名(用空格分割) 
xargs就是将ls的输出,每20个为一组(以空格为分隔符),作为rm -rf的参数 
也就是说将所有文件名20个为一组,由rm -rf删除,这样就不会超过命令行的长度了 

31、for循环总结 
a. for((i=1;i<=10;i++));do echo $(expr $i \* 4);done 
b. 在shell中常用的是 for i in $(seq 10) 
c. for i in `ls` 
d. for i in ${arr[@]}   
e. for i in $* ; do 
f. for File in /proc/sys/net/ipv4/conf/*/accept_redirects; do 
g. for i in f1 f2 f3 ;do 
h. for i in *.txt 
i. for i in $(ls *.txt) 
   for in语句与` `和$( )合用,利用` `或$( )的将多行合为一行的缺陷,实际是合为一个字符串数组 
   for num in $(seq 1 100) 
j. LIST="rootfs usr data data2" 
   for d in $LIST; do 
   用for in语句自动对字符串按空格遍历的特性,对多个目录遍历 
k. for i in {1..10} 
l. for i in stringchar {1..10} 
m. awk 'BEGIN{for(i=1; i<=10; i++) print i}' 

注意:AWK中的for循环写法和C语言一样的 
参考: http://hi.baidu.com/plp_cm/blog/item/d828d1881b05e2faf11f3607.html  

32、格式转换 
dos2unix, unix2dos 用来实现 DOS <=> UNIX text file 转换 
Shell代码
  1. unix2dos target.$date.txt  
  2. dos2unix target.$date.txt  


33、根据起止日期打印期间的日期 
Shell代码
  1. #!/bin/sh  
  2. #riqizizeng  
  3. datebeg=$1  
  4. dateend=$2  
  5. #read datebeg  
  6. #read dateend  
  7. beg_s=`date -d "$datebeg" +%s`  
  8. end_s=`date -d "$dateend" +%s`  
  9. while "$beg_s" -le "$end_s"  
  10. do  
  11. day=`date -d @$beg_s +"%Y-%m-%d"`;//本次循环的日期  
  12. beg_s=$((beg_s+86400))  
  13. done  


34、用awk来对比两个文件 
要求:输出a.txt中包含b.txt的行 
命令: 
Shell代码
  1. awk 'NR==FNR{a[substr($2,3)]=$0;next}{if($0 in a)print a[$0]}' a.txt b.txt c.txt  

备注:awk参数用法: http://bbs.chinaunix.net/thread-691456-1-1.html http://bbs.chinaunix.net/thread-1797847-1-1.html  
substr($2,3):表示截取a.txt第二列从第三个字符开始的所有字符。 
if($0 in a):如果b.txt的一行跟a.txt第二列截取字符的相等。 

a.txt(数据源1) 
---------------- 
12 x=abc 
14 x=ccc 
15 x=acd 

b.txt(数据源2) 
---------------- 
abc 
ccc 
efg 

c.txt(结果) 
---------------- 
12 x=abc 
14 x=ccc 

35、在root用户下查看端口被哪个用户占用 
Shell代码
  1. lsof -i:8091  


36、查看一个关键字的前后N行 
Shell代码
  1. cat tomcat/debuglog/debug.log.2012-07-05-21  |grep -B 5 -A 25 java.net.SocketTimeoutException  


37、根据修改时间判定文件数目(适用于大数目文件夹哦) 
Shell代码
  1. ll |awk '{print $6$7$8}' |grep Aug212012 |wc -l   

备注:$6表示月份,$7表示日期(最近几天只显示时间),$8表示年份。 
如上命令表示:2012-08-21日产生的文件数目
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
=============================================== TeeChart Pro v2013 Copyright (c) 1995-2013 by Steema Software All Rights Reserved =============================================== SOFTWARE LICENSING CONTRACT NOTICE TO USER: THIS IS A CONTRACT. BY CLICKING THE 'OK' BUTTON BELOW DURING INSTALLATION, YOU ACCEPT ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT. =========================================== License Terms: =============== -- A Single License of TeeChart Pro VCL is per developer. -- A Site License of TeeChart Pro VCL is per "physical place" with unlimited number of developers under the same company building(s). -- For special licensing issues, volume discounts, integrations or redistribution please contact us at: sales@steema.com TeeChart Pro is royalty free under the following use conditions ================================== You can freely distribute TeeChart Pro code COMPILED into your applications as executables or dynamic link libraries, including as OCX ActiveX Controls or ActiveX Forms, excepting compilation as design-time packages or compilation into a DLL or OCX for use in a Web server scripting environment. The latter case requires that a WebServer runtime license be registered per installed server. You are NOT allowed to distribute stand-alone TeeChart Pro files, TeeChart Pro source code, TeeChart Pro manual and help file or everything else contained in this software without receiving our written permission. You are NOT allowed to distribute the TeeChart design-time package files and/or any of the TeeChart *.DCP or any other file from the source code files. You can freely distribute the TeeChart evaluation version, located at our web site http://www.steema.com END-USER LICENSE AGREEMENT FOR STEEMA SOFTWARE SL IMPORTANT- READ CAREFULLY BEFORE INSTALLING THE SOFTWARE. This End User License Agreement (this "EULA") contains the terms and conditions regarding your use of the SOFTWARE (as defined below) and material

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值