vi查找:
当你用vi打开一个文件后,因为文件太长,如何才能找到你所要查找的关键字呢?在vi里可没有菜单-〉查找,不过没关系,你在命令模式下敲斜杆(/)这时在状态栏(也就是屏幕左下脚)就出现了 “/”然后输入你要查找的关键字敲回车就可以了。如果你要继续查找此关键字,敲字符n就可以继续查找了。值得注意的是“/”是向下查找,而“?”是向上查找,而在键盘定义上“?”刚好是“/”的上档符。
vi替换:
vi/vim 中可以使用 :s 命令来替换字符串以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊飕还有很多需要学习),记录几种在此,方便以后查询。
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/vivian/sky/(等同于:g/vivian/s//sky/)替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于:g/vivian/s//sky/g)替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 /):/oradata/apras/替换成/user01/apras1/
开机启动
Centos 7
vi /etc/rc.d/rc.local
/xx.sh
chmod +x xx.sh
UBUNTU
vi /etc/rc.local centos7
/etc/init.d
启动脚本的创建
现在我们以安装nginx为例,假设我们的nginx安装在/usr/sbin/目录下。
- 首先,我们在/etc/init.d创建文件sudo vim nginx,并将shell代码拷贝进去。
- 修改文件权限为755 sudo chmod 755 nginx。
- 添加服务到启动过程 sudo update-rc.d nginx defaults。
sudo update-rc.d start_weedfs.sh defaults
现在,我们就可以用以下命令正常启动nginx了。
启动
/etc/init.d/nginx start
停止
/etc/init.d/nginx stop
重启
/etc/init.d/nginx restart
curl
看:Linux下命令行cURL的
10种常见用法示例
curl常用命令
curl 命令详解
sed说明
Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
sed命令的应用
默认是sed -e,一个可以省略 但是多点编辑可以用多个-e, -n是影响结果的某一般p打印是需要加
#sed 的 -i 选项可以直接修改文件内容 没有-i的可以随便改不生效
#直接修改文件内容(危险动作)
#利用 sed 直接在 regular_express.txt 最后一行($)加入 This is a test
sed -i '$a This is a test' regular_express.txt
#多点编辑
#一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
#-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
#新增
#那如果是要在第2行前插入
nl /etc/passwd | sed '2i drink tea'
#在第二行后(亦即是加在第三行)加上『drink tea?』字样!
nl /etc/passwd | sed '2a drink tea'
#如果是要增加两行以上,在第二行后面加入两行字,例如 Drink tea or ..... 与 drink beer?
nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer'
# 每一行之间都必须要以反斜杠『 \ 』来进行新行的添加喔!所以,上面的例子中,我们可以发现在第一行的最后面就有 \ 存在。
# 删除
#那如果是要在第2行
nl /etc/passwd | sed '2d'
#将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!
nl /etc/passwd | sed '2,5d'
#要删除第 2 到最后一行
nl /etc/passwd | sed '2,$d'
#将第2-5行的内容取代成为『No 2-5 number』呢?
nl testfile | sed '2,3c No 2-3 number'
# sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。 不加-n的话,会打印原文和需要打印的行
sed -n '2,3p' testfile
#数据的搜寻并显示
sed -n '/root/p' testfile
#数据的搜寻并删除
sed '/root/d' testfile
#数据的搜寻并替换
sed 's/要被取代的字串/新的字串/g'
# 替换addr:开头的和Bcast.*结尾的
cat testfile | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
#a 动作是在匹配的行之后追加字符串,追加的字符串中可以包含换行符(实现追加多行的情况)。
追加一行的话前后都不需要添加换行符 \n,只有追加多行时在行与行之间才需要添加换行符(最后一行最后也无需添加,添加的话会多出一个空行)。
#4 行之后添加一行:
sed -e '4 a newline' testfile
#4 行之后追加 2 行:
sed -e '4 a newline\nnewline2' testfile
#4 行之后追加 3 行(2 行文字和 1 行空行)
sed -e '4 a newline\nnewline2\n' testfile
#4 行之后追加 1 行空行:
sed '4 a \ ' testfile 实际上
# 可以添加一个完全为空的空行
sed '4 a \\' testfile
# 可以添加两个完全为空的空行
sed '4a \\n' testfile
echo "Hello World" | grep -e Hello
sed '1~2d' 1.txt #从第一行开始删除,每隔2行就删掉一行,即删除奇数行
sed '$chello' 1.txt #将最后一行替换为hello
sed '/123/chello' 1.txt #将包含123的行替换为hello
sed '/123/d' 1.txt #删除匹配123的行
sed '$ahello' 1.txt #在最后一行添加hello
sed '1,2!d' 1.txt #删除1~2之外的所有行
sed '$d' 1.txt #删除最后一行
sed '/123/,$d' 1.txt #删除从匹配123的行到最后一行
sed '/123/,+1d' 1.txt #删除匹配123的行及其后面一行
sed '/^$/d' 1.txt #删除空行
sed '/123\|abc/!d' 1.txt #删除不匹配123或abc的行,/123\|abc/ 表示匹配123或abc ,!表示取反
sed -n 's/123/hello/gpw 2.txt' 1.txt #将每行中所有匹配的123替换为hello,并将替换后的内容写入2.txt
sed 's/123/hello/g' 1.txt #将文本中所有的123都替换为hello
sed 's/123/hello/' 1.txt #将文件中的123替换为hello,默认只替换每行第一个123
sed 's/123/hello/2' 1.txt #将每行中第二个匹配的123替换为hello
sed 's/$/&'haha'/' 1.txt # 在1.txt文件的每一行后面加上"haha"字段
sed -n '2~2p' 1.txt #从第二行开始,每隔两行打印一行,波浪号后面的2表示步长
sed -n '/bob/,3p' 1.txt #逐行读取文件,打印从匹配bob的行到第3行的内容
sed -n '3,/you/p' 1.txt #只打印第三行到匹配you的行
sed -n "$=" 1.txt #打印1.txt文件最后一行的行号(即文件有多少行,和wc -l 功能类似)
sed -n '/error/=' 1.txt #打印匹配error的行的行号
sed -n '/error/{=;p}' 1.txt #打印匹配error的行的行号和内容(可用于查看日志中有error的行及其内容)
sed 'r 2.txt' 1.txt #将文件2.txt中的内容,读入1.txt中,会在1.txt中的每一行后都读入2.txt的内容
sed '$r 2.txt' 1.txt #在1.txt的最后一行插入2.txt的内容
sed -n 'w 2.txt' 1.txt #将1.txt文件的内容写入2.txt文件,如果2.txt文件不存在则创建,如果2.txt存在则覆盖之前的内容
sed -n -e '1w 2.txt' -e '$w 3.txt' 1.txt #将1.txt的第1行和最后一行分别写入2.txt和3.txt
sed -n '/abc\|123/w 2.txt' 1.txt #将1.txt中匹配abc或123的行的内容,写入到2.txt中
sed -n '/666/,$w 2.txt' 1.txt #将1.txt中从匹配666的行到最后一行的内容,写入到2.txt中
sed -n '/xyz/,+2w 2.txt' 1.txt #将1.txt中从匹配xyz的行及其后2行的内容,写入到2.txt中
#顺序颠倒
sed 's#(第一段)(二段)(三段)#\3\2\1# 变成(三段)(二段)(一段)这种形式
实例2:删除文件中的空白行
#!/bin/bash
if [ ! -f $1 ];then #判断参数是否为文件且存在
echo "$0 is not a file"
exit
fi
sed -i "/^$/d" $1 #将空白行删除
实例1:替换文件中的内容
#!/bin/bash
if [ $# -ne 3 ];then #判断参数个数
echo "Usage: $0 old-part new-part filename" #输出脚本用法
exit
fi
sed -i "s#$1#$2#" $3 #将 旧内容进行替换,当$1和$2中包含"/"时,替换指令中的定界符需要更换为其他符号
实例3:格式化文本内容
#!/bin/bash
a='s/^ *>// #定义一个变量a保存sed指令,'s/^ *>//':表示匹配以0个或多空格开头紧跟一个'>'号的行,将匹配内容替换
s/\t*// #'s/\t*//':表示匹配以0个或多个制表符开头的行,将匹配内容替换
s/^>// #'s/^>//' :表示匹配以'>'开头的行,将匹配内容替换
s/^ *//' #'s/^ *//':表示匹配以0个或多个空格开头的行,将匹配内容替换
#echo $a
sed "$a" $1 #对用户给定的文本文件进行格式化处理
awk
#
awk -F ':' 'print{$1}' filename 以:分割 打印出第一列
'print{$1,$3}' 打印第一列和第三列
'print{$0}' 表示整行
awk -F ':' '$1~/root/' filename 用第一列去匹配 root
awk -F ':' '$1==10 ' filename第一列的数值等于10的才匹配出来
'print{NR}' NR表示行号
awk -F ':' '$1==“/bin/bash” ' filename
awk -F ':' '$1=$3+$4” ' filename
$NF 表示最后一列
函数
if
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
for
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
#--------------------
#!/bin/bash
for((i=1;i<=5;i++));do
echo "这是第 $i 次调用";
done;
while
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
until循环
#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
无限循环语法格式:
for (( ; ; ))
或者
while true
do
command
done
或者
while :
do
command
done
case
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1|2|3) echo '你选择了 1 2 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
continue
;;
esac
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
注意, 10 不 能 获 取 第 十 个 参 数 , 获 取 第 十 个 参 数 需 要 10 不能获取第十个参数,获取第十个参数需要 10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。
参数处理 | 说明 |
---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
函数返回值在调用该函数后通过 $? 来获得。
注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
循环
a=10
for i in `seq 1 $a`
或者
#!/bin/bash a=10 for ((i=1;i<=a;i++)) do echo $i done
cut
一、作用:可对文本的每一行进行操作,获取想要的结果。
二、选项:
1、cut -d: -f1 file1,对于file1进行cut,以:为分隔,取每行的第1个字段,有-d必有-f;
2、cut -b3 file1,对于file1进行cut,取每行的第3个字节
如file1的内容为“abc”,则此命令后输出c。若file1的内容为“星期一”,再这么用就会出现乱码,因为1个汉字是占2个字符的,这时候就要用cut -b3 -n file1 就会输出“一”了。-b和-n是一对好×××,适用于一个字占据多个字节的情况(比如汉字)
3、cut -c3 file1,对于file1进行cut,取每行的第3个字符,这个命令秒杀数字、字母、汉字等,都能显示正确的命令,因为不管一个字占几个字节,但是字和字符总是一对一的。
三、缺点:
由于cut -df中 只能把单个的符号作为分隔符,所以对于“#¥%”之类多个符号去分隔字段的情况只能干瞪眼了
shell脚本[] [[]] -n -z 的含义解析
= 与 == 在 [ ] 中表示判断(字符串比较)时是等价的,
在 (( )) 中 = 表示赋值, == 表示判断(整数比较),它们不等价
== 可用于判断变量是否相等,= 除了可用于判断变量是否相等外,还可以表示赋值。
1、在中括号中,判断变量的值, 加不加双引号的问题?
-z 判断 变量的值,是否为空; zero = 0
- 变量的值,为空,返回0,为true
- 变量的值,非空,返回1,为false
-n 判断变量的值,是否为空 name = 名字 - 变量的值,为空,返回1,为false
- 变量的值,非空,返回0,为true
pid=“123”
[ -z “$pid” ] 单对中括号变量必须要加双引号
[[ -z $pid ]] 双对括号,变量不用加双引号
[ -n “$pid” ] 单对中括号,变量必须要加双引号
[[ -z $pid ]] 双对中括号,变量不用加双引号
2、多个条件判断,[] 和 [[]] 的区别?
2.1:[[ ]] 双对中括号,是不能使用 -a 或者 -o的参数进行比较的;
&& 并且 || 或 -a 并且 -o 或者
[[ ]] 条件判断 && 并且 || 或
[[ 5 -lt 3 || 3 -gt 6 ]] 一个条件,满足,就成立 或者的关系
[[ 5 -lt 3 || 3 -gt 6 ]] 一个条件满足,就成立 或者的关系
[[ 5 -lt 3 ]] || [[3 -gt 6 ]]
[[ 5 -lt 3 ]] || [[3 -gt 6 ]] 写在外面也可以
&& 必须两个条件同时满足,和上述一样,这里想说明的问题的是:
[[ 5 -lt 3]] -o [[ 3 -gt 6 ]] [[ 5 -lt 3 -o 3 -gt 6 ]]
[[ 5 -lt 3 -a 3 -gt 6 ]] [[ 5 -lt 3 -a 3 -gt 6 ]]
-a 和 -o就不成立了,是因为,[[]] 双对中括号,不能使用 -o和 -a的参数
直接报错:
2.2 [ ] 可以使用 -a -o的参数,但是必须在 [ ] 中括号内,判断条件,例如:
[ 5 -lt 3 -o 3 -gt 2 ] 或者条件成立
[5 -lt 3 ] -o [ 3 -gt 2] 或者条件, 这个不成立,因为必须在中括号内判断
如果想在中括号外判断两个条件,必须用&& 和 || 比较
[5 -lt 3 ] || [ 3 -gt 2]
[5 -gt 3 ] && [ 3 -gt 2] 成立
相对的,|| 和 && 不能在中括号内使用,只能在中括号外使用
3、当判断某个变量的值是否满足正则表达式的时候,必须使用[[ ]] 双对中括号
单对中括号,直接报错:
文件表达式
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
filename1 -nt filename2 如果 filename1比 filename2新,则为真。
filename1 -ot filename2 如果 filename1比 filename2旧,则为真。
整数变量表达式
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
字符串变量表达式
If [ $a = $b ] 如果string1等于string2,则为真
字符串允许使用赋值号做等号
if [ $string1 != $string2 ] 如果string1不等于string2,则为真
if [ -n $string ] 如果string 非空(非0),返回0(true)
if [ -z $string ] 如果string 为空,则为真
if [ $sting ] 如果string 非空,返回0 (和-n类似)
逻辑非 ! 条件表达式的相反
if [ ! 表达式 ]
if [ ! -d
n
u
m
]
如
果
不
存
在
目
录
num ] 如果不存在目录
num]如果不存在目录num
逻辑与 –a 条件表达式的并列
if [ 表达式1 –a 表达式2 ]
逻辑或 -o 条件表达式的或
if [ 表达式1 –o 表达式2 ]
//需要特别注意的是,当变量为空时,如果判断变量是否为空字符串,需要加引号,否则判断错误。
oa-start.sh
#!/bin/sh
JAR_NAMES=("oa-web-admin.jar" "oa-api.jar" "workflow-web-api.jar")
PRO_NAMES=("oaweb" "oaapi" "workflow")
PORTS=(9090 9091 9096);
HOME="/home/yyt/java-project/oa/jar"
for((i=0;i<${#PORTS[@]};i++))
do
echo "--------${JAR_NAMES[i]} 开始启动--------------"
P_ID=`netstat -anp|grep ${PORTS[i]}|awk '{printf $7}'|cut -d/ -f1`
if [ -n "$P_ID" ]; then
echo "server already start,pid:$P_ID"
return 0
fi
#进入命令所在目录
cd $HOME
nohup java -jar $HOME/${JAR_NAMES[i]} --server.port=${PORTS[i]} --spring.profiles.active=${PRO_NAMES[i]} -Dspring.config.location=application-${PRO_NAMES[i]}.yml > /dev/null 2>&1 &
P_ID=`netstat -anp|grep ${PORTS[i]}|awk '{printf $7}'|cut -d/ -f1`
while [ -z "$P_ID" ];do
P_ID=`netstat -anp|grep ${PORTS[i]}|awk '{printf $7}'|cut -d/ -f1`
done
echo "--------${JAR_NAMES[i]}在port:${PORTS[i]} pid:$P_ID启动成功--------------"
done
oa-stop.sh
#!/bin/sh
JAR_NAMES=("oa-web-admin.jar" "oa-api.jar" "workflow-web-api.jar")
PORTS=(9090 9091 9096);
for((i=0;i<${#PORTS[@]};i++))
do
echo "--------${JAR_NAMES[i]} 开始关闭--------------"
P_ID=`netstat -anp|grep ${PORTS[i]}|awk '{printf $7}'|cut -d/ -f1`
if [ -z "$P_ID" ]; then
echo "===${JAR_NAMES[i]} process not exists or stop success"
return 0
fi
kill -9 $P_ID
echo "${JAR_NAMES[i]} killed success"
done