1、脚本之间传递参数 "1.sh"的脚本,接受参数。如下,如果有一个参数则赋值个sourceFile这个变量,否则用默认值。
【资料图】
Shell代码
#!/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"的脚本,传递参数
Shell代码
#!/bin/bash
sh 1.sh 参数1 参数2 ...
备注:多个参数之间用空格符隔开。 2、文件内容行之间的排序
Shell代码
#!/bin/bash
sort -t= +4 文件 ”
备注:“=”表示按=号进行切割(注意:只能是单个字符),“+4”表示按第五个项进行排序。 更多参数: -r 表示降序排序 -n 表示按数字大小排序 -k 表示根据那个字段排序,4.1,表示第4列第一个字符开始 ,5表示到第5个字段为结束 -t 后面跟分隔符,缺省是空格 例如:sort -r -n -k4.1,5 3、判断目录是否存在,没有则新建一个目录
Shell代码
#!/bin/bash
dayDir="/home/logs/"
if [ ! -d "$dayDir" ]
then mkdir "$dayDir" fi
4、判断文件是否存在,有则删除
Shell代码
#!/bin/bash
if [ -f "$FAIL_FILE" ]
then
rm -rf "$FAIL_FILE"
echo `date`" FILE IS EXISTS: "$FAIL_FILE
fi
5、找出文件中的相关行
Shell代码
#!/bin/bash
cat 文件 |grep -a "关键词" >> result.log
备注:把文件中包含关键词的行输出到result.log中。 6、文件切分
Shell代码
#!/bin/bash
awk -F"" "{print $1}" 文件
备注:“”表示分隔符,“print”表示换行输出(printf不换行),“$1”表示取第一项。“文件”表示要切分的文件 7、文件内容排重
Shell代码
#!/bin/bash
awk -F"," "!a[$1]++" test.txt
备注:“,”表示按“,”号分隔;“$1”表示按第一项排重;“test.txt”表示要处理的文件。 8、grep多个关键字
Shell代码
#!/bin/bash
cat $file |grep -a "aop=keyword1\|keyword2"
备注:多个关键字用“\|”分隔。 9、时间格式化,中间有空格的需要加引号
Shell代码
#!/bin/bash
TODAY=`date -d today "+%Y-%m-%d %H:%M:%S"`
10、多个文件合并
Shell代码
#!/bin/bash
cat $FILE1 $FILE2 |grep -a "关键字" > $MERGE_FILE
11、运行java项目
Shell代码
#!/bin/bash
LANG=en_US.UTF-8
export 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、根据关键字统计行数,赋值给变量
Shell代码
#!/bin/bash
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代码
#!/bin/bash
##示例1:10和12为两个参数分别对应$1和$2
echo 10 12 |awk "{printf("%d\n", $1+$2)}"
##示例2:a和b作为两个变量传入
a=10
b=12
echo |awk "{printf("%d\n", "$a"+"$b")}"
##示例3:COUNT_FAIL除以COUNT_INIT 保留4为小数,结果赋值给FAIL_INIT,[b]结果四舍五入[/b]。
COUNT_FAIL=10
COUNT_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命令
Shell代码
#!/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命令
Shell代码
#!/bin/bash
count=10
count=`expr $count + 12`
echo $count
d.使用let命令
Shell代码
#!/bin/bash
##示例1
let num1=10*20
echo $num1
##示例2
let "num2=10*20"
echo $num2
e.加双括号
Shell代码
#!/bin/bash
##示例1:双小括号
a=12
b=20
echo $((a*b))
echo $(($a*$b))
##示例2:中括号
c=10
echo $[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/bash
echo "hello jack!" |tee -a log1.txt log2.txt
备注:“-a”追加,否则清空重写。 15、针对某个域进行分组统计
Shell代码
#!/bin/bash
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代码
#!/bin/bash history |grep "rm"
备注:查询包含“rm”字符的命令记录。 17、循环删除所有文件
Shell代码
#!/bin/bash
for i in `ls`; do rm $i; done
备注:在文件非常多的情况下,rm * 命令不能删除所有文件。所以需要遍历删除每一个文件。 18、遍历文件夹并按第二个域对文件内容排序。
Shell代码
#!/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、查看文件夹下所有文件数目和所有文件夹数目
Shell代码
#!/bin/bash
#查看当前文件夹下所有文件数目
find . -type f |wc -l
#查看当前文件夹下所有文件夹数目
find . -type d |wc -l
备注:“.”表示当前目录,可以换成其他路径。 20、shell与java正则区别
Java代码
String regex = "2010-11-08.+"
//或者 regex = "2010-11-08.*"
备注:JAVA中匹配以“2010-11-08"开头的字符串。
Shell代码
regex = "2010-11-08*"
备注:SHELL中匹配以“2010-11-08”开头的字符串。 “.*”或“.+”在java中表示任意多个字符串,如果要匹配“.”号,需要加转义“\”。 “*”在shell表示任意多个字符,加“.”或“+”号都会错误。 21、编码转换命令
Shell代码
iconv -f gb2312 -t utf-8 a.log > b.log
备注:表示把a.log文件从gb2312编码转成utf-8的编码,并把文件写入b.log 22、批量替换多个文件中的字符串
Shell代码
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代码
#!/bin/sh
export _JAVA_SR_SIGNUM=12
export JAVA_HOME=/usr/java/jdk1.6.0_11
export CATALINA_BASE=/home/co_newest_family/tomcat
export CATALINA_HOME=/usr/local/apache-tomcat-6.0.18
export LD_LIBRARY_PATH=:/usr/local/lib/:/usr/local/apr/lib/:/usr/local/apr/lib/
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"
export PATH=$JAVA_HOME/bin:$PATH:$HOME/bin
date=`date "+%H:%M:%S"`
message="$date|check_tomcat(81_co_newest_family)_shutdown_and_restart_it."
request_url="http://10.27.5.81:9091/index.jsp"
if ! wget -t1 -T2 $request_url &> /dev/null;then
#pid=`ps aux | grep "\-Dcms4.home\=\/home\/co_newest_family\/"| awk "{print $2}"`
#kill -9 $pid
ps x|grep "tomcat"|grep -v "grep"|grep -v "sh"|awk "{print $1}"|xargs kill -9
$CATALINA_HOME/bin/startup.sh
wget -t1 -T2 http://10.27.5.112:8880/send.jsp?msg=$message &> /dev/null;
echo "$date check tomcat shutdown and restart it." >> logs/check.log
else
echo "$date check tomcat ok." >> logs/check.log
fi
rm -f index.jsp*
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代码
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代码
#!/bin/sh
while read line
do
echo $line
done < filename
方法二:
Shell代码
#!/bin/sh
cat filename | while read line
do
echo $line
done
30、删除数量比较多的文件
Shell代码
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代码
unix2dos target.$date.txt
dos2unix target.$date.txt
33、根据起止日期打印期间的日期
Shell代码
#!/bin/sh
#riqizizeng
datebeg=$1
dateend=$2
#read datebeg
#read dateend
beg_s=`date -d "$datebeg" +%s`
end_s=`date -d "$dateend" +%s`
while [ "$beg_s" -le "$end_s" ]
do
day=`date -d @$beg_s +"%Y-%m-%d"`;//本次循环的日期
beg_s=$((beg_s+86400))
done
34、用awk来对比两个文件 要求:输出a.txt中包含b.txt的行 命令:
Shell代码
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代码
lsof -i:8091
36、查看一个关键字的前后N行
Shell代码
cat tomcat/debuglog/debug.log.2012-07-05-21 |grep -B 5 -A 25 java.net.SocketTimeoutException
37、根据修改时间判定文件数目(适用于大数目文件夹哦)
Shell代码
ll |awk "{print $6$7$8}" |grep Aug212012 |wc -l
备注:$6表示月份,$7表示日期(最近几天只显示时间),$8表示年份。 如上命令表示:2012-08-21日产生的文件数目
1月31日,山西焦煤召开煤炭增产保供专题会议,传达学习国家和省煤炭增产保供最新会议精神,协调解决一季度煤炭增产保供工作中存在的问题,更多
2023-02-02 11:55:36国家发展改革委等部门关于修订印发《煤矿安全改造中央预算内投资专项管理办法》的通知发改能源规〔2023〕80号各省、自治区、直辖市、新疆生产更多
2023-02-02 11:16:351月31日举行的2023年山西省能源工作会议,总结2022年能源工作,分析当前发展形势,部署今年工作任务。 会上,山西省能源局介绍,2022年更多
2023-02-02 10:01:002月1日,来关注山西煤炭企业新年的生产情况。山西是我国能源大省,2022年煤炭产量达到13亿吨,位居全国第一。位于山西太原的官地煤矿是一更多
2023-02-02 10:11:28据宁波市重要生产资料市场监测系统监测,12月份,全市煤炭均价为117725元吨,环比下降2%。其中烟煤9305元吨,环比下降15%;无烟煤1424元吨更多
2023-02-02 09:53:41据商务部重要生产资料市场监测系统显示,上周(2023年1月16日-22日),云南省煤炭均价为1530元吨,环比上涨05%。其中,动力煤均价8501元吨更多
2023-02-02 10:02:12据商务部重要生产资料市场监测系统显示,1月21日至1月27日,陕西省煤炭均价16100元吨,环比下跌63%。其中:无烟煤18500元吨,环比下跌149%更多
2023-02-02 09:54:101月31日上午,中国煤炭工业协会国际合作部主任苏传荣一行拜会日本石油天然气·金属矿物资源机构北京办事处,与新任所长古谷寿之等举行会谈更多
2023-02-01 15:57:41今年煤炭增产不低于5%、将达1365亿吨,同时还要兼顾双碳。1月31日,能源大省山西开年即聚焦能源增产保供。 在2023年山西能源工作会上,更多
2023-02-01 10:54:02国家统计局31日发布消息,2022年,规模以上工业企业实现营业收入13791万亿元,比上年增长59%;发生营业成本11684万亿元,增长71%;营业收更多
2023-02-01 10:09:55