专栏首页吴柯的运维笔记Linux下常用的shell脚本整理

Linux下常用的shell脚本整理

<转>分享下看到比较好的关于常用的shell脚本,供大家学习:

1、脚本之间互相调用与传递参数

  "1.sh"的脚本,接受参数。如下,如果有一个参数则赋值个sourceFile这个变量,否则用默认值。

  Shell代码

  1.

  2. #!/bin/bash

  3..UTF-8

  4. #get parameters

  5. sourceFile="/data/log/abc" #$sourcefile时,bash会去着该路径,如果找不到该路径的话,sourcefile为null

  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. bash 1.sh 参数1 参数2 ... #调用1.sh脚本,并将参数传入

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

  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"

  6.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

  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:10和12为两个参数分别对应$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 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: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.htmlhttp://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日产生的文件数目

本文分享自微信公众号 - 吴柯的运维笔记(wukeyy18s)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MongoDB安装配置基础教程

    MongoDB是一个C++编写的基于分布式文件存储的开源数据库系统,是一个介于关系和非关系之间的数据库,当然也属于NoSQL的行列,MongoDB最大的特点就...

    吴柯
  • 部署Cacti监控平台实现网络监控

    Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具。 Cacti是通过 snmpget来获取数据,使用 RRDtoo...

    吴柯
  • 4个for/while循环语句及case语句实用脚本

    脚本1:工作中如果要批量关机,可使用以下脚本查看192.168.4.0网段哪些是关机,哪些是开机状态。 ? 备注:1.{1..254}也可写作`seq 1 ...

    吴柯
  • 《Java从入门到放弃》JavaSE入门篇(十二):文件操作

    在讲Java中的文件操作前,先了解一个概念——“流”,比如我们把一个杯子的水倒到另一个同样大小的杯子,就是以流的方式处理的(如果你把水冻成冰了再整个放进去就当我...

    良月柒
  • 使用Python字符串的编码与解码方法实现信息加解密

    代码思路很简单,字符串的encode()方法可以将其编码为字节串,在生成的字节串中插入干扰字节后无法正常解码,要想还原信息,必须清楚干扰字节的位置并删除后再使用...

    Python小屋屋主
  • 通过Java代码实现图片的放大和缩小

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.blog....

    Jerry Wang
  • 利用反射根据方法名执行方法的使用示例

    本人在使用httpclient做接口测试的过程中,写了一个简单框架,经过不断进行封装和优化代码,在昨天终于解决了困扰许久的问题。其中一个非常重要的方法就是在学了...

    八音弦
  • webpack务虚扫盲

    打包工具的角色 所谓打包工具在web开发中主要解决的问题是: (1)文件依赖管理。毕竟现在都是模块化开发,打包工具首先就是要梳理文件之间的依赖关系。 (2)资源...

    用户1217459
  • 一个媒体人的大数据属性与案例应用大全

    一般谈到大数据技术的时候,毫无疑问,都会想到大数据定义的4V,以及结构化、非结构化数据处理、数据挖掘,以及高性能并行计算等。 不过一说到大数据应用,一般就显得青...

    小莹莹
  • 9个不错的前端开源项目

    无论您是刚开始编程还是已经是一名经验丰富的开发人员,在这个行业中,学习新的概念和语言/框架是跟上快速变化的必要条件。

    前端迷

扫码关注云+社区

领取腾讯云代金券