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、变量赋值前后不要有空格

img

解释

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编程中替换文件中的内容用到四个命sedfindgrepawk
下面是三种使用替换的方法

方法一:

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 读取文件指定单行 多行 连续行 倒数几行
三种方法

  1. tail -n +/-数字 文件名
  2. head -n 数字 文件名
  3. 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
posted @ 2021-06-01 08:32  nuaazs  阅读(82)  评论(0)    收藏  举报