博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转载]常用的shell脚本
阅读量:5225 次
发布时间:2019-06-14

本文共 9138 字,大约阅读时间需要 30 分钟。

原文地址:
作者:
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("%dn", $1+$2)}'   
  5.   
  6. ##示例2:a和b作为两个变量传入   
  7. a=10   
  8. b=12   
  9. echo |awk '{printf("%dn", '$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 "%.4fn",'$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 i 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 f |wc -l   
  4.   
  5. #查看当前文件夹下所有文件夹数目   
  6. find . -type d |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:
 

参见2:
 


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语言一样的 

参考:
 


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参数用法:
 

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日产生的文件数目

转载于:https://www.cnblogs.com/linewman/p/9918720.html

你可能感兴趣的文章
exit和return的区别
查看>>
js += 含义(小知识)
查看>>
B2321 [BeiJing2011集训]星器 数学&&物理
查看>>
201571030319 四则运算
查看>>
RestTemplate 调用本地服务 connection refused
查看>>
.NET方向高级开发人员面试时应该事先考虑的问题
查看>>
台达PLC modbus 不支持04功能码
查看>>
发布一个JavaScript工具类库jutil,欢迎使用,欢迎补充,欢迎挑错!
查看>>
discuz 常用脚本格式化数据
查看>>
MS CRM 2011 创建基于Fetch的报表 -- 进阶版
查看>>
洛谷P2777
查看>>
PHPStorm2017设置字体与设置浏览器访问
查看>>
SQL查询总结 - wanglei
查看>>
安装cocoa pods时出现Operation not permitted - /usr/bin/xcodeproj的问题
查看>>
makefile中使用变量
查看>>
GIT笔记:将项目发布到码云
查看>>
JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
查看>>
JavaScript 鸭子模型
查看>>
SQL Server 如何查询表定义的列和索引信息
查看>>
GCD 之线程死锁
查看>>