Shell CookBook
0. shell基础
0.1 循环
类c语言
for ((i=1; i<=100; i ++))
do
echo $i
done
in使用
for i in {1..100}
do
echo $i
done
seq使用
seq - print a sequence of numbers
for i in `seq 1 100`
do
echo $i
done
shell脚本实现取当前时间
shell 实现获取当前时间,并进行格式转换的方法:
原格式输出
2018年 09月 30日 星期日 15:55:15 CST
time1=$(date)
echo $time1
时间串输出
20180930155515
1 #!bin/bash
2 time2=$(date "+%Y%m%d%H%M%S")
3 echo $time2
3)2018-09-30 15:55:15
#!bin/bash
time3=$(date "+%Y-%m-%d %H:%M:%S")
echo $time3
2018.09.30
#!bin/bash
time4=$(date "+%Y.%m.%d")
echo $time4
注意
1、date后面有一个空格,shell对空格要求严格
2、变量赋值前后不要有空格

解释
1 Y显示4位年份,如:2018;y显示2位年份,如:18。
2 m表示月份;M表示分钟。
3 d表示天;D则表示当前日期,如:1/18/18(也就是2018.1.18)。
4 H表示小时,而h显示月份。
5 s显示当前秒钟,单位为毫秒;S显示当前秒钟,单位为秒。
1. 批量替换文件内容
shell编程中替换文件中的内容用到四个命sed,find ,grep,awk
下面是三种使用替换的方法
方法一:
find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'
下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的http://repo1.maven.org/maven2 替换为http://localhost:8081/nexus/content/groups/public.
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'
这里用到了Perl语言, perl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
find -name 'pom.xml' | xargs perl -pi -e 's|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g'
方法二:
Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。
用sed命令可以批量替换多个文件中的 字符串。
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`
例如:我要把mahuinan替换 为huinanma,执行命令:
sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www'
这是目前linux最简单的批量替换字符串命令了!
具体格式如下:
sed -i "s/oldString/newString/g" `grep oldString -rl /path`
实例代码:
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl /usr/aa`
sed -i "s/大小多少/日月水火/g" `grep 大小多少 -rl ./`
方法三:
在日程的开发过程中,可能大家会遇到将某个变量名修改为另一个变量名的情况,如果这个变量是一个局部变量的话,vi足以胜任,但是如果是某个全局变量的话,并且在很多文件中进行了使用,这个时候使用vi就是 一个不明智的选择。这里给出一个简单的shell命令,可以一次性将所有文件中的指定字符串进行修改:
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'
批量替换 配置文件中的IP:
grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/172\.0\.0\.1/g'
2. 批量替换文件名
批量改名,删除文件名中多余字符。目录下文件名为如下,要求去掉_finished。
stu_102999_1_finished.jpg
stu_102999_2_finished.jpg
stu_102999_3_finished.jpg
stu_102999_4_finished.jpg
stu_102999_5_finished.jpg
可以实现的方法有很多种:
方法一:for循环结合sed替换
for file in `ls *.jpg`;do mv $file `echo $file|sed 's/_finished//g'`;done;
方法二:ls结合awk,输出交给bash执行
ls *.jpg |awk -F "_finished" '{print "mv "$0" "$1$2""}'|bash
实际执行的命令如下,以_finished作为分隔符,mv及变量 需要加双引号
ls *.jpg |awk -F "_finished" '{print "mv "$0" "$1$2""}'
mv stu_102999_1_finished.jpg stu_102999_1.jpg
mv stu_102999_2_finished.jpg stu_102999_2.jpg
mv stu_102999_3_finished.jpg stu_102999_3.jpg
mv stu_102999_4_finished.jpg stu_102999_4.jpg
mv stu_102999_5_finished.jpg stu_102999_5.jpg
方法三:rename改名
rename "_finished" "" *.jpg
方法四:for循环加变量部分截取
for file in `ls *.jpg`;do mv $file `echo ${file%_finished*}.jpg`;done;
不使用echo也可以实现
for file in `ls *.jpg`;do mv $file ${file%_finished*}.jpg;done;
更改后结果如下:
stu_102999_1.jpg
stu_102999_2.jpg
stu_102999_3.jpg
stu_102999_4.jpg
stu_102999_5.jpg
批量编号文件
顺序编号
#!/bin/bash
#rename.sh
#批量编号
n=1 #number to start
for f in *
do
if [ "${f}" = "rename.sh" ] || [ "${f}" = "resume.sh" ]
then
continue
fi
fname2ch=`(printf "%03d" ${n})`
let n+=1
mv "$f" "${fname2ch} $f"
done
恢复文件名
#!/bin/bash
#resume.sh
#恢复文件名
for f in *
do
if [ "${f}" = "rename.sh" ] || [ "${f}" = "resume.sh" ]
then
continue
fi
mv "$f" "${f:4}"
done
3. 批量运行Gate
4. alias命令参数
alias log='new() { /home/iint/zhaosheng/CT/log/"$1".txt ;}; new'
5. shell读取文件指定行
shell 读取文件指定单行 多行 连续行 倒数几行
三种方法
tail -n +/-数字 文件名head -n 数字 文件名sed -n "开始行,结束行p" 文件名
下面分别介绍这几种方法:
cd 到要文件所在目录。cd到要查看指定行数内容的文件所在目录,以SpecialVariable.sh文件为例,cd /home/test/shell/
tail -n +/-数字 文件名
tail -n +/-数字 文件名
tail -n -数字 文件名,表示查看文件的最后几行,比如查看SpecialVariable.sh的最后5行
tail -n -5 SpecialVariable.sh
tail -n +数字 文件名
tail -n +数字 文件名,表示查看文件的某一行到最后一行,比如查看SpecialVariable.sh的第3行到最后一行
tail -n +3 SpecialVariable.sh
head -n 数字 文件名
head -n 数字 文件名,表示查看文件前几行的内容,比如查看SpecialVariable.sh的前3行内容
head -n 3 SpecialVariable.sh
读取文件列表倒数2行
ls /data/mysql/log/binlog |head -n -2
sed -n "开始行,结束行p" 文件名
sed -n "开始行,结束行p" 文件名,表示查看文件的开始行到结束行的内容
sed -n "5,9p" SpecialVariable.sh
接分号,表示打印特定行,如下命令只会打印出第一行与第十行
sed -n '1p;10p' test.txt
接逗号,表达连续的行娄,如下命令打印出第一行到第十行
sed -n '1,10p' test.txt
如下命令打印1~5行与第9行.
sed -n '1,5p;9p' test.txt

浙公网安备 33010602011771号