Shell代码
- #!/bin/bash
- LANG=en_US.UTF-8
- #get parameters
- sourceFile="/data/log/abc"
- if [ $# == 1 ]
- then sourceFile=$1
- else echo "$1 required!"
- echo $sourceFile
关于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 文件 ”
更多参数:
-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
Shell代码
- #!/bin/bash
- if [ -f "$FAIL_FILE" ]
- rm -rf "$FAIL_FILE"
- echo `date`" FILE IS EXISTS: "$FAIL_FILE
Shell代码
- #!/bin/bash
- cat 文件 |grep -a "关键词" >> result.log
6、文件切分
Shell代码
- #!/bin/bash
- awk -F'' '{print $1}' 文件
7、文件内容排重
Shell代码
- #!/bin/bash
- awk -F',' '!a[$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'`
Shell代码
- #!/bin/bash
- cat $FILE1 $FILE2 |grep -a "关键字" > $MERGE_FILE
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
12、根据关键字统计行数,赋值给变量
Shell代码
- #!/bin/bash
- COUNT=$(cat $FILE |grep -a "关键字" |wc -l)
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作为两个变量传入
- 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
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`
Shell代码
- #!/bin/bash
- count=10
- count=`expr $count + 12`
- echo $count
Shell代码
- #!/bin/bash
- ##示例1
- let num1=10*20
- echo $num1
- ##示例2
- let "num2=10*20"
- echo $num2
Shell代码
- #!/bin/bash
- ##示例1:双小括号
- echo $((a*b))
- echo $(($a*$b))
- ##示例2:中括号
- 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
15、针对某个域进行分组统计
Shell代码
- #!/bin/bash
- cat $FILE |awk -F"" '{list[$11]++;}END{for (val in list) print val, list[val];}' |tee -a $RESULT_FILE
16、查询控制命令的历史记录
Shell代码
- #!/bin/bash history |grep "rm"
17、循环删除所有文件
Shell代码
- #!/bin/bash
- for i in `ls`; do rm $i; done
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`
- if [ -d $1"/"$file ]
- ergodic $1"/"$file
- f=$1"/"$file
- #调用排序函数
- sortfile $f
- #以参数形式运行程序
- if [ $# == 1 ];
- echo "parameter: "$1;
- ergodic $1
- echo "a file directory required!"
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.*"
Shell代码
- regex = "2010-11-08*"
“.*”或“.+”在java中表示任意多个字符串,如果要匹配“.”号,需要加转义“\”。 “*”在shell表示任意多个字符,加“.”或“+”号都会错误。
21、编码转换命令
Shell代码
- iconv -f gb2312 -t utf-8 a.log > 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
- echo "$date check tomcat ok." >> logs/check.log
- rm -f index.jsp*
- rm -f send.jsp?msg=*
-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
-l 表示按行切割
tt.txt 表示切割后的零碎文件的前缀
29、循环读取行
读取文件每行并输出
方法一:
Shell代码
- #!/bin/sh
- while read line
- echo $line
- done < filename
Shell代码
- #!/bin/sh
- cat filename | while read line
- echo $line
Shell代码
- ls | xargs -n 20 rm -rf
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
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" ]
- day=`date -d @$beg_s +"%Y-%m-%d"`;//本次循环的日期
- beg_s=$((beg_s+86400))
要求:输出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
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
Shell代码
- cat tomcat/debuglog/debug.log.2012-07-05-21 |grep -B 5 -A 25 java.net.SocketTimeoutException
Shell代码
- ll |awk '{print $6$7$8}' |grep Aug212012 |wc -l
如上命令表示:2012-08-21日产生的文件数目