linux中 sed、awk、函数的使用

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

SpringBoot配置文件加载位置与优先级

参见:

sed使用

shell脚本–sed的用法

runoob.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值