linux相关
shell程序必须以#!/bin/sh开始(必须放在文件的第一行):
符号#!用来告诉系统它后面的参数是用来执行该文件的程序,在这个例子中我们使用/bin/sh来执行程序。当编辑好脚本时,如果要执行该脚本,还必须使其可执行,要使脚本可执行:chmod +x filename,然后可以通过输入:./filename来执行脚本
注释:
以#开头的行就是注释,会被解释器忽略
Shell中没有多行注释,只能每一行加一个#号
1、定义字符串
字符串定义可以用单引号,也可以用双引号,也可以不用引号
a='besttest' b="besttest" c=besttest
2、拼接字符串
把一个字符串跟到另一个字符串后面即可,例如:
name="besttest"
say="hello, "$name""
say1="hello, ${name}"
echo $say $say1
3、获取字符串长度
#来获取字符串的长度
str='besttest'
echo ${#str}
4、获取字符串的某个元素
s='besttest is a good school'
echo ${s:1:4}
定义数组
在Shell中,用括号来表示数组,数组元素用空格符号分隔开,不像其他语言中用逗号分隔,shell中只支持一维数组,数组的下标可以不连续,可以放任何类型的元素
例如:array=(value1 value2 … )
数组的取值方式:${array_name[index]}
使用@或*可以获取数组中的所有元素,例如echo ${list[*]}或echo ${list[@]}
获取数组长度的方法与获取字符串长度的方法相同,使用#,例如:echo ${#list[*]}
条件判断:
-eq(equal) : 测试两个整数是否相等;比如 $A -eq $B
-ne(inequality) : 测试两个整数是否不等;不等,为真;相等,为假;
-gt(greter than) : 测试一个数是否大于另一个数;大于,为真;否则,为假;
-lt(less than) : 测试一个数是否小于另一个数;小于,为真;否则,为假;
-ge(greter equal): 大于或等于
-le(less equal) :小于或等于
备份日志的脚本:
src_path = '/opt/lampp/logs/access_log' # 源日志文件路径
tar_path = '/tmp/logs' # 目标日志文件路径
time = `date + %Y%m%d%H%M%S` # 获取时间命令(命令用``这个符号,不能用'',用''代表的是一个字符串)
cp -rf ${src_path} ${tar_path}access_log_${time} # 将源文件拷贝到目标路径下
> ${src_path} # 将之前的文件重定向为空就可以了
将上面五行命令复制到bak_log.sh里,然后
crontab -e
59 23 * * * sh /tmp/bak_log.sh(命令写实际命令)
定时运行
写个shell脚本对文件进行批量改名,把当前文件夹下文件名含有aaa的都改成大写的AAA,比如21-aaa.doc就要改成21-AAA.doc
find . -name "*aaa*" -exec rename aaa AAA {} \; find . -name "*aaa*" | xargs rename aaa AAA;
然后还有一个任务,将每个文件的执行权限去掉,这样写:
for filename in *
do
chmod ugo-x $filename
done
写shell脚本,重启tomcat并打印出日志
pid = `ps -ef | grep mysql | grep -v grep | awk '{print $2}'` # 获取到tomcat的pid
kill -9 $pid # 杀掉进程
echo 'tomcat stop' # 打印出tomcat stop
sh /usr/local/tomcat_dang/bin/startup.sh
tail -f /usr/local/tomcat_dang/logs/catalina.out # 打印出日志
把上面5行命令写到一个文件里,如r_tomcat.sh,加权限chmod +x r_tomcat.sh,启动r_tomcat.sh
写shell脚本,停止tomcat,脚本里加了判断
pid=`ps -ef | grep mysql | grep -v grep | awk '{print $2}'` # =两边不能有空格
if [ $pid ] #[]里边有空格
then
kill -9 $pid
echo 'tomcat stop....' # 输出指定的字符串
else
echo 'tomcat is not running...'
fi
service命令
service在linux中主要用于操作系统程序,例如service iptables stop,service network restart,service httpd start,service可执行的文件保存在/etc/init.d,如下图:
wc(Word Count):统计指定文件中的行数、字节数、字数,并将统计结果显示输出
cat 1209.txt|sort|uniq 先排序再去重(必须是相邻的,加上sort之后就是相邻的)
cat 1209.txt|sort|uniq -c 每个字节出现的次数
cat 1209.txt|sort|uniq|wc 统计字数,第一列是有11行,第二列是有11个字(一个字被定义为由空白、跳格或换行字符分隔的字符串),第三列是有22个字节数
cat 1209.txt|sort|uniq|wc -l 只显示行数,wc -L是打印最长行的长度
有个文件source.txt,其中每行有一个字符串,请写出统计字符串"hello"出现次数的shell命令?
grep -o 'hello' 3.log | wc -l -o指示grep显示所有匹配的地方,并且每一个匹配单独一行输出
统计当前路径下,所有以.log为后缀的文件个数?
find . -name "*.log"|wc -l
rename命令用字符串替换的方式批量改变文件名,mv只是针对单个文件
rename 原字符串 目标字符串 文件(指定要改变文件名的文件列表)
linux命令之rename命令实例,将main1.c重命名为main.c
rename main1.c main.c main1.c
rename支持通配符
? 可替代单个字符
* 可替代多个字符
如果使用rename foo foo0 foo?,会把foo1到foo9的文件重命名为foo01到foo09,重命名的文件只是有4个字符长度名称的文件,文件名中的foo被替换为foo0
如果使用rename foo foo0 foo*,foo001到foo278的所有文件都被重命名为foo0001到foo0278,所有以foo开头的文件都被重命名
rename支持正则表达式
字母的替换
rename "s/AA/aa/" * # 把文件名中的AA替换成aa
修改文件的后缀
rename "s//.html//.php/" * # 把.html 后缀的改成 .php后缀
批量添加文件后缀
rename "s/$//.txt/" * # 把所有的文件名都以txt结尾
批量删除文件名
rename "s//.txt//" * # 把所有以.txt结尾的文件名的.txt删掉
java -jar jar包---直接运行
java bsh.Console---界面UI方式
java bsh.Interpreter---命令行方式
java bsh.Interpreter filename[args]---运行脚本文件