常有shell脚本

2011年4月7日woyoo3,341 浏览数发表评论阅读评论

转载:http://hdxiong.iteye.com/blog/949063

1、脚本之间传递参数 “1.sh”的脚本,接受参数。


如下,如果有一个参数则赋值个sourceFile这个变量,否则用默认值。

#!/bin/bash
LANG=en_US.UTF-8
#get parameters
sourceFile=”/data/log/abc”
if [ $# == 1 ]
then sourceFile=$1
else echo “$1 required!”
fi
echo $sourceFile

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

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

“2.sh”的脚本,传递参数
#!/bin/bashsh 1.sh 参数1 参数2 …
备注:多个参数之间用空格符隔开


2、文件内容行之间的排序

#!/bin/bashsort -t= +4 文件 ”
备注:“=”表示按=号进行切割,“+4”表示按第五个项进行排序


3、判断目录是否存在,没有则新建一个目录

#!/bin/bash
dayDir=”/home/logs/”
if [ ! -d “$dayDir” ]
then mkdir “$dayDir” fi

4、判断文件是否存在,有则删除

#!/bin/bash
if [ -f “$FAIL_FILE” ]
then
rm -rf “$FAIL_FILE”
echo 
date
” FILE IS EXISTS: “$FAIL_FILE
fi

5、找出文件中的相关行

#!/bin/bashcat 文件 |grep -a “关键词” >> result.log
备注:把文件中包含关键词的行输出到result.log中。

6、文件切分

#!/bin/bashawk -F” ‘{print $1}’ 文件
备注:“”表示分隔符,“print”表示换行输出(printf不换行),“$1”表示取第一项。“文件”表示要切分的文件

7、文件内容排重

#!/bin/bashawk -F’,’ ‘!a[$1]++’ test.txt
备注:“,”表示按“,”号分隔;“$1”表示按第一项排重;“test.txt”表示要处理的文件。

8、grep多个关键字

#!/bin/bashcat $file |grep -a “aop=keyword1\|keyword2″
备注:多个关键字用“\|”分隔


9、时间格式化,中间有空格的需要加引号

#!/bin/bash
TODAY=
date -d today '+%Y-%m-%d %H:%M:%S'


10、多个文件合并

#!/bin/bashcat $FILE1 $FILE2 |grep -a “关键字” > $MERGE_FILE

11、运行java项目

#!/bin/bashLANG=en_US.UTF-8export LANG=$LANG/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、根据关键字统计行数,赋值给变量

#!/bin/bashCOUNT=$(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计算
#!/bin/bash##示例1:10和12为两个参数分别对应$1和$2echo 10 12 |awk ‘{printf(“%d\n”, $1+$2)}’
##示例2:a和b作为两个变量传入a=10b=12echo |awk ‘{printf(“%d\n”, ‘$a’+’$b’)}’
##示例3:COUNT_FAIL除以COUNT_INIT 保留4为小数,结果赋值给FAIL_INIT,[b]结果四舍五入[/b]。COUNT_FAIL=10COUNT_INIT=20 FAIL_INIT=awk 'BEGIN{printf "%.4f\n",'$COUNT_FAIL'/'$COUNT_INIT'}'echo $FAIL_INIT
备注:示例2和示例3两种写法除数和被除数都要加“’”号(单引号),否则会报错“division by zero attempted”,另外“BEGIN”也很重要哦。
b.使用bc命令
#!/bin/bash##示例1:输出 1+2 的运算结果echo 1+2 |bc
##示例2:COUNT_FAIL除以COUNT_INIT 保留2为小数,结果赋值给FAIL_INIT,[b]结果不四舍五入[/b]。FAIL_INIT=echo "scale=2; $COUNT_FAIL/$COUNT_INIT" | bc
c.使用expr命令
#!/bin/bashcount=10count=expr $count + 12echo $count
d.使用let命令
#!/bin/bash##示例1let num1=10*20echo $num1
##示例2let “num2=10*20″echo $num2
e.加双括号
#!/bin/bash##示例1:双小括号a=12b=20echo $((a*b))echo $(($a*$b))
##示例2:中括号c=10echo [c*20]echo $[$c*20]
备注:此种写法括号里面的变量可以不用加“$”符号,但是括号外面的“$”符号一定要加上。

14、运用tee命令将日志同时输出到多个文件

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

15、针对某个域进行分组统计

#!/bin/bashcat $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、查询控制命令的历史记录

#!/bin/bash history |grep “rm”
备注:查询包含“rm”字符的命令记录。
17、循环删除所有文件
#!/bin/bashfor i in ls; do rm $i; done
备注:在文件非常多的情况下,rm * 命令不能删除所有文件。所以需要遍历删除每一个文件。

18、遍历文件夹并按第二个域对文件内容排序。

#!/bin/bash
#用等号分隔,按第二个域排序
function sortfile(){
echo ‘Processing: ‘$1 sort -t= +1 $1 > $1’_temp’
mv $1’_temp’ $1
}
#遍历文件夹,调用排序函数
function ergodic(){
for file in 
ls $1
do
if [ -d $1″/”$file ]
then
ergodic $1″/”$file
else
f=$1″/”$file
#调用排序函数
sortfile $f
fi
done
}
#以参数形式运行程序
if [ $# == 1 ];
then
echo “parameter: “$1;
ergodic $1
else
echo “a file directory required!”
fi

19、查看文件夹下所有文件数目和所有文件夹数目

#!/bin/bash #查看当前文件夹下所有文件数目 find . -type f |wc -l #查看当前文件夹下所有文件夹数目 find . -type d |wc -l
备注:“.”表示当前目录,可以换成其他路径。

20、shell与java正则区别

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

21、编码转换命令

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