精通shell编程--最后的总结

摘要:
Exprmatch${a}123#从头开始的匹配可以与matchsearchfindall##关联

不得不说shell语法是丑陋的,操作是简单高效的,最后一次学习总结shell

shell总结

字符串删除与替换等常见操作

## 字符串长度
a=1234
echo "${#a}"

expr length "${a}"

## 字符串 索引
expr index ${a} 23 # 拆分 2 3 一个个查找找到第一个匹配的就返回

## 字符串 匹配 有问题?
expr match ${a} 123 # 从头开始匹配 可以联想 match search  findall

## substring
echo ${a:2:3} #--> 3,4
echo ${a: -3} # --> 反向,特别注意冒号后有空格
或者写成
echo ${a:(-3)}
echo ${a:(-3):2} # ${} 下标是从 0 开始, expr 却是从1开始,已经无力吐槽!!!丑陋的shell!!!

expr substr ${a} 2 3 -->234

b="I love you! Do you love me?""${b#*ove}" # 正向非贪婪 删除 到ove截止  --》  you! Do you love me?

echo "${b##*ove}" # 正向贪婪 删除 到ove截止 --》 me?

echo "${b%ove*}" # 反向也就是从右到左非贪婪到ove --》 I love you! Do you l
echo "${b%%ove*}" # 反向也就是从右到左贪婪到ove --》 I

##--替换--##
echo "${PATH/bin/BIN}"  # 正向非贪婪替换小写bin -》 大写 BIN
echo "${PATH//bin/BIN}" # 正向贪婪替换小写bin -》 大写 BIN
 l

字符串变量测试 很麻烦不做掌握要求

字符串作业

#!/bin/sh
:<<EOF
需求描述:
   变量 string="Bigdata process framework is Hadoop,Hadoop is an open source project."
   执行脚本后, 打印输出 string字符串变量,并给出用户以下选项:
   (1) 打印string长度
   (2) 删除字符串中所有的Hadoop
   (3) 替换第一个Hadoop为Mapreduce
   (4) 替换全部Hadoop为Mapreduce

   用户输入数字 1|2|3|4 执行对应项的功能, 输入 q|Q 退出交互模式
EOF


string="Bigdata process framework is Hadoop,Hadoop is an open source project."

while :
do
read -p "请选择要执行的选项:
   (1) 打印string长度
   (2) 删除字符串中所有的Hadoop
   (3) 替换第一个Hadoop为Mapreduce
   (4) 替换全部Hadoop为Mapreduce
" choice

echo "choice: ${choice}"
case "${choice}" in
[qQ]) exit;;
1) echo "string长度: ${#string}";;
2) echo "删除字符串中所有的Hadoop: ${string##*Hadoop}";;
3) echo "替换第一个Hadoop为Mapreduce: ${string/Hadoop/Mapreduce}";;
4) echo "替换全部Hadoop为Mapreduce: ${string//Hadoop/Mapreduce}";;
*) echo "请输入 1 or 2 or 3 or 4"
esac
done


# 启停 脚本
#!/bin/bash
AI_HOME=/opt/jintel/modeler/pycohortquery
STARTAI=${AI_HOME}/start_ai_service.sh
STOPAI=${AI_HOME}/stop_ai_service.sh

case $1 in
start|Start)
echo "start ai service"
$STARTAI
;;
stop|Stop) echo "stop ai service"
$STOPAI
;;
*) echo "not support operation..."
esac

命令替换

`command`    --> date
$(command)   --> ${date}

$(())  <==> $[]  # 做数字运算
echo "this is $(date +%Y) year"
this is 2019 year
echo "this is $(($(date +%Y) + 1)) year"
this is 2020 year
echo "this is $[$(date +%Y) + 1] year"
this is 2020 year


num=1

((num++)) --> num=$[num+1] --> num=$(($num+1))
((num--))

在今年已经过了 echo $[$(date +%j) / 7] 天 /7  == 过了的星期数
31
echo $[(365-$(date +%j)) / 7]  ==》 今年还剩下星期数


#!/bin/sh

index=1

for user in `cat /etc/passwd|cut -d ":" -f 1`; do
    echo "${index} -> ${user}"
    index=$((${index}+1))
	#index=$[index+1]
done


# 判断 , 拉起守护进程

if [ $(ps -ef|grep nginx|grep -v grep|wc -l) -eq 0 ]; then
    echo "0"
    systemctl start nginx # 守护进程代码
fi

有类型变量

declare -r var="hello world!"  # 只读
declare -i num_3=20   # 声明为整型
declare -f  # 把系统提供的所有可用函数以及内容显示
declare -F  # 把系统提供的所有可用函数仅仅显示 函数名
declare-a array

## 数组的常见操作 ${#array[@]} --> 数组长度  ${#array[1]} --> 第二个元素的字符长度
一般可以认为数组操作与字符串操作类似

declare -x ==》 export

 

bash 数学运算

精通shell编程--最后的总结第1张

#!/bin/sh
:<<EOF
输入一个正整数 num 然后计算 1+2+3+...+num 的值, 必须对 num是否为正整数做判断不符合应当允许再次输入
EOF

func_tips(){
    echo "输入一个正整数 num 然后计算 1+2+3+...+num 的值, 必须对 num是否为正整数做判断不符合应当允许再次输入"
}

func_sum(){
    num=$1
    sum=0
    while [ $num -gt 0 ];
    do
        echo "num now is $num"
        sum=`expr $sum + $num`
        ((num--))
    done
    echo "sum is ${sum}"
    #printf("sum is %d",sum)
}

func_tips

while true;
do

read -p "请输入一个正整数: " num

expr $num + 1 &> /dev/null

if [ $? -ne 0 ]; then
continue
fi

flag=`expr $num > 0`

if [ ${flag} -eq 1 ]; then
func_sum $num
break
exit 0
fi
done

 今天编写shell脚本。想要程序在运行到一个地方的时候进行判断,结果为真退出程序。运行时直接退出了SecureCRT终端。纠结了一整个上午也没有找到解决方案。

    中午在同事的示范下发现并不是脚本的问题。而是执行方式的问题。

Linux执行文件有如下几种方式:   

(1)./xxx.sh意思是执行当前目录的a.sh文件,与输入完整路径执行脚本效果是一样的。需要a.sh有可执行权限。
(2)sh xxx.sh意思是用shell解释器来执行a.sh脚本,不要求文件有可执行权限。
(3). xxx.sh和source效果相同,作用都是使刚修改过的配置文件立即生效。

shell中使用source conf.sh,是直接运行conf.sh的命令,不创建子shell,source不是直接执行一个文件,而是从一个文本文件里面读命令行,然后执行这些命令。我执行的时候使用了 .  XX.sh,这样相当于直接系统读取exit,然后退出,正确的运行方式是 ./XX.sh 或者sh XX.sh

 

sh是则创建子shell,子shell里面的变量父shell无法使用,对环境变量的修改也不影响父shell。父shell中的局部变量,子shell也无法使用,只有父shell的环境变量,子shell能够使用.

bc bash 内建 计算器 可以计算浮点类型

echo "scale=4;24/3" | bc   # 保留四位有效数字的 除法

自定义守护进程

#!/bin/bash

this_pid=$$

while true;
do
ps -ef|grep ml_pluginxxx.jar|grep -v grep|grep -v ${this_pid} &>/dev/null

if [ $? -eq 1 ]; then
    sudo nohup xxx.jar>/dev/null 2>&1 &
fi
done

shell版 简单四则运算

#!/bin/bash

func_tips(){
    echo "请按照如下格式输入要计算的式子 10 + 20 "
}

function func_calculate {
    echo $2
    case "$2" in
    +|-|/) echo "$1 $2 $3 = `expr $1 $2 $3`";;
    \*) echo "$1 * $3 = `expr $1 * $3`";;
    *) echo "no support operators...";;
    esac
}

main_process(){
    func_tips
    func_calculate $1 $2 $3
}

main_process $1 $2 $3

函数的 返回有两种 return 0 , >0 的状态值, 或者 echo 返回一个 list用于返回数据在别处使用

定义自己的 函数库 . /root/lib/myshlib/basefunc.lib 引入

友好的高亮显示

#!/bin/sh
#定义颜色变量
RED='E[1;31m'      # 红
GREEN='E[1;32m'    # 绿
YELOW='E[1;33m'    # 黄
BLUE='E[1;34m'     # 蓝
PINK='E[1;35m'     # 粉红
RES='E[0m'         # 清除颜色

#用echo -e来调用
echo -e "${RED} this is red color ${RES}"
echo -e "${GREEN} this is green color ${RES}"
echo -e "${YELOW} this is red yelow ${RES}"
echo -e "${BLUE} this is blue color ${RES}"
echo -e "${PINK} this is pink color ${RES}"

find 命令 , 记住 常用参数即可

find / -maxdepth|-mindepth  2 -iname *log.txt -type -f -mtime +5 -print0 -ok '' # 随便写的 需要再次补充


文本处理 无外乎 增删改查

文本处理三剑客 grep + sed + awk ==> 这些如果细究可以写一本书了,我们这里只能是浅尝。。。用到特别复杂的情况时去翻看字典就好

grep 这一块 最复杂的情况还是在 正则表达式的书写

精通shell编程--最后的总结第2张

grep -inrwcE "nltk|NLTK" ./FirstNLP/

-v 不显示匹配航信息
-i  忽略大小写
-n  显示匹配到的行号
-r   递归查找文本内容
-w  整词匹配
-c   只显示匹配行的总数
-E  extended regex

-F  Not extended regex 费扩展正则 ,仅按照字面意思匹配
-X  整行匹配
-l   只列出匹配到的文件名
-s  不显示错误信息

sed stream editor <== vim ,可对 字符串做 替换删除 append 等操作

精通shell编程--最后的总结第3张

sed.txt :

I love python
I love PYTHON
I love python

sed -n -e '/PYTHON/p' -e '/python/p' sed.txt

# 从文件里使用匹配模式及命令
sed -n -f edit.sed  sed.txt

# enable 扩展表达式  -r
sed -n -r -e '/python|PYTHON/p' sed.txt


# 替换
sed -n -e 's/love/like/g;p' sed.txt

# 复杂一些的 匹配
# 打印某一行 ,打印某个区间内的行

sed -n '1p' /etc/passwd

sed -n '1,5p' /etc/passwd

sed -n '5,+6p' /etc/passwd

sed -n '/^ambari/,/^gnome/p' /etc/passwd  , 打印  从匹配 pattern1  的行 到 匹配 pattern2 的行

# 查找 没有登录权限的账户
sed -n '//sbin/nologin/p' /etc/passwd 

# 从 第一行开始直到匹配 到 gnome 模式的行 打印
sed -n '1,/gnome/p' /etc/passwd

# 从匹配到 ambari 的行开始 到 26 行 进行打印 
sed -n '/ambari/,26p' /etc/passwd

# 匹配两个 匹配模式之间的行
sed -n '/^root/,/^ambari/p' passwd


sed -n '8,//sbin/nologin/p' passwd

sed -n '//bin/bash/,5p' passwd


# 在此之前 我们可以 借助 grep -n 'ambari' /etc/passwd 查看 行号再做决定


精通shell编程--最后的总结第4张

精通shell编程--最后的总结第5张

# 更加复杂的操作 如 s//   i  a r w d
cp /etc/passwd  ~/test/
sed -i '//sbin/nologin/d' passwd  # 删除 符合匹配模式的 行


sed -i '//bin/bash/a This is user which can login to system' passwd # 在符合匹配模式的行后追加

sed -i '//sbin/nologin/i who cannot login to system' passwd # 在符合匹配模式的行前插入



append.txt:

append text

sed -i '//sbin/nologin/r append.txt' passwd  # 从文件里 读取要被 append 的文本


sed -i '//bin/bash/w /tmp/user_login_2.txt' passwd  #  将符合匹配模式的行 写入某个文件


sed -i 's/games/play games/2ig' passwd # 忽略大小写查找替换从第 2 个开始的所有 games 为 play games

sed -n '//sbin/nologin/=' passwd


# 分组捕获做替换  & 1  ==> 不同的是 1 需要前面 加 括号  但是更加灵活 可以 括起来一部分

I like HadAAp.
I like HadBBp.
I like HadCCp.
I like HadDDp.
I like HadEEps.
I like hadAAp.
I like hadBBp.
I like hadCCp.
I like hadDDp.

sed -i 's/Had..p/&s/g' hadooptest.txt

sed -i 's/had(..)p/123(1)456/g' hadooptest.txt

sed -i -r 's/123(..)456/hadoop/g' hadooptest.txt  # 技巧 , 模式不确定情况下 可以  -n   p  这样 先 打印一下下



my.cnf



sed -r -n '/^[.*?]/w tempmysql.cnf' my.cnf


sed -n -r '/^[.*?]/p' my.cnf |sed 's/[(.*)]/1/g'


my.cnf


[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
pid-file = /usr/local/mysql/mysql.pid
socket=/usr/local/mysql/mysql.sock
[server]
ab
cd
ef
[socket]
jho
lhi
[unknown]
fasdf
vdvadf





#!/bin/bash




func_list_segments(){
    echo "`sed -n -r '/^[.*?]/p' my.cnf |sed 's/[(.*)]/1/g'`"
}

func_get_itemcounts(){

    index=0
    items=`sed -n '/['$1']/,/[.*]/p' my.cnf `
    for item in ${items};
    do
      index=$[index+1]
    done
    echo "$1: $index"
}

func_get_itemcounts mysqld


number=0
for segment in `func_list_segments`;
do
    number=`expr ${number} + 1`
    echo "$number: `func_get_itemcounts ${segment}`"

#echo "配置项 : ${segment}"

done




# 删除 注释 以及 空行
sed -i -e '/^#/d' -e '/^$/d' my.cnf


sed -i -e '/^[:blank:]*#/d' -e '/^$/d' my.cnf

sed -i -e '/^[:blank:]*#/d;/^$/d' my.cnf


# 非以 # 开头的 行 前面 加 * 号
sed -i 's/^[^#]/*&/g' my.cnf

awk 报表生成 神器

精通shell编程--最后的总结第6张

awk 'BEGIN{FS=":"}$3<=100 && $3>=50{print $0}' /etc/passwd

awk -F ":" '{if($3>=50 && $3<=100){print $0}}' /etc/passwd



保存为 statisticuser.awk 然后 用 awk -f 命令执行
BEGIN{
        FS=":"
}
{
    if($3<=50){
                printf("%-20s%-20s%-5d
", "UID <= 50", $1, $3)
    }
}

awk -f statisticuser.awk  /etc/passwd

scores.txt

Allen 80 90 96 98
Mike 93 98 92 91
Zhang 78 76 87 92
Jerry 86 89 68 92
Han 85 95 75 90
Li 78 88 98 100

# 打印出 平均分  大于 90 的 人的信息

BEGIN{
    printf("%-20s%-10s%-10s%-10s%-10s%-10s
", "Name", "Chinese", "English","Math","GM","AVG_SCORE")
}

{
    total_score=0
    for(i=1;i<=NF;i++){
       total_score=total_score+$i
    }
    avg_score=total_score/(NF-1)
    if(avg_score>90){
        printf("%-20s%-10s%-10s%-10s%-10s%-10s
", $1,$2,$3,$4,$5,avg_score)
    }
}

END{

}




awk 中的 字符串函数

length(str)  计算长度

1、 以 : 为分隔符, 返回 /etc/passwd 中每行中每个字段的 长度

#为分隔符, 返回 /etc/passwd 中每行中每个字段的 长度
BEGIN{FS=":"}
{
    for(i=1;i<=NF;i++){
       if(i!=NF){
           printf("%-5d:", length($i))
       }else{
           printf("%-5d
", length(i))
      }
   }
}

awk -f len4eachcol.awk /etc/passwd


index(str1, str2) 返回在 str1 中查询到的 str2 的位置

awk '{printf("index is: %d ", index($0,"ea"))}' <<EOF
> "I have a dream"
> EOF

awk 'BEGIN{str="I have a dream";printf("index is: %-5d
",index(str,"ea"))}'

tolower(str)   小写转换

awk 'BEGIN{str="Hadoop is a bigdata Framework";printf("%-20s
", tolower(str))}'

toupper(str)   大写转换

awk 'BEGIN{str="Hadoop is a bigdata Framework";printf("%-20s
", toupper(str))}'

split(str,arr,fs) 分隔 字符串 , 并保存到数组中

awk 'BEGIN{str="Hadoop is a bigdata Framework"; split(str,ary," "); for(a in ary){printf("%-10s
",ary[a])}}'


match(str,regEx)  返回正则表达式匹配到的子串的位置

awk 'BEGIN{str="abc 1233 efag";printf("%-5d
" , match(str,/[0-9]/))}'

substr(str,m,n)   截取子串, 从 m 个字符开始 截取 n 位。 若 n 不指定 则 默认 截取到最后?

awk 'BEGIN{str="abc12345efg";printf("从第四位开始截取五位: %-10s
" , substr(str,4,5))}'

sub(RegEx,RepStr,str)   替换查找到的第一个子串

awk 'BEGIN{str="abc123efg456hij789lmn";sub(/[0-9]+/,"\d",str); printf("%-10s
",str)}'

gsub(RegEx,RepStr,str)  替换查找到的所有子串

awk 'BEGIN{str="abc123efg456hij789lmn";gsub(/[0-9]+/,"\d",str); printf("%-10s
",str)}'



# awk 自身参数
-v   传入外部 参数

num1=20
var="hello world"
awk -v num2="$num1" -v var_1="$var" 'BEGIN{ print num2, var_1}'

-V  查看 版本号

-f 从文件里 执行 awk 

-F ":"  《==》  FS=":"


awk 实战


生成数据的脚本:insert.sh

#!/bin/bash
function create_random {
    min=$1
    max=$(($2-$min+1))
    num=$(date +%s%N)
    echo $(($num%$max+$min))
}

INDEX=1
while true
do
    for user in Mike Allen Jerry Tracy Hanmeimei Lilei
    do
        COUNT=$RANDOM
        NUM1=`create_random 1 $COUNT`
        NUM2=`expr $COUNT - $NUM1`
        echo "`date "+%Y-%m-%d %H:%M:%S"`" $INDEX Batches: $user insert $COUNT data into table 'test1', insert $NUM1 records successfully, failed insert $NUM2 records >> /root/script/data.txt
        INDEX=`expr $INDEX + 1`
    done
done

(1)、统计每个人员插入了多少条数据进数据库
awk 'BEGIN{printf "%-10s %-10s
","name","total"}{stat[$5]+=$7}END{for(i in stat){printf "%-10s %-10s
",i,stat[i]}}' data.txt
# awk 里的数组 好比 Python 中的 字典

awk '{ary[$5]+=$7;}END{for (a in ary){printf("%-10s insert %-20d data rows
",a,ary[a])}}' data.txt

(2)、统计每个人员插入成功和失败了多少条数据进数据库
awk 'BEGIN{printf "%-10s %-10s %-10s %-10s
","User","Total","Succeed","Failed"}{sum[$5]+=$7;suc_sum[$5]+=$13;fail_sum[$5]+=$18}END{for(i in sum){printf "%-10s %-10s %-10s %-10s
",i,sum[i],suc_sum[i],fail_sum[i]}}' data.txt



 awk 'BEGIN{printf("%-20s %-20s %-20s
","name","insert rows","failed rows")}{insert[$5]=$7;failed[$5]=$18}END{for(a in insert){printf("%20s %-20s %-20s
",a,insert[a], failed[a])}}' data.txt


(3)、在(2)的基础上统计全部插入记录数
awk 'BEGIN{printf "%-10s %-10s %-10s %-10s
","User","Total","Succeed","Failed"}{sum[$5]+=$7;suc_sum[$5]+=$13;fail_sum[$5]+=$18}END{for(i in sum){all_sum+=sum[i];all_suc_sum+=suc_sum[i];all_fail_sum+=fail_sum[i];printf "%-10s %-10s %-10s %-10s
",i,sum[i],suc_sum[i],fail_sum[i]};printf "%-10s %-10s %-10s %-10s
","",all_sum,all_suc_sum,all_fail_sum}' data.txt

(4)、查找丢失数据,也就是成功+失败的记录数不等于总共插入的记录数
awk '{if($7!=$13+$18){print $0}}' data.txt


awk '{ary[$5]+=$7;}END{for (a in ary){printf("%-10s insert %-20d data rows
",a,ary[a])}}' data.txt


操作 Mysql 数据库

yum list all|grep mariadb

yum install mariadb mariadb-server mariadb-libs -y

systemctl status mariadb # 查看  mariadb 服务状态

systemctl start mariadb

mysql 直接可以进入 mysql 交互界面

create database school default character set utf8;

预准备 sql 脚本 与 测试数据

CREATE TABLE `student`(
       `s_id` VARCHAR(20),
	   `s_name` VARCHAR(20) NOT NULL DEFAULT '',
	   `s_birth` VARCHAR(20) NOT NULL DEFAULT '',
	   `s_sex`   VARCHAR(10) NOT NULL DEFAULT '',
	   PRIMARY KEY(`s_id`)
);

CREATE TABLE `course`(
       `c_id`  VARCHAR(20),
	   `c_name` VARCHAR(20) NOT NULL DEFAULT '',
	   `t_id`   VARCHAR(20) NOT NULL,
	   PRIMARY KEY(`c_id`)
 );
 
CREATE TABLE `teacher`(
       `t_id` VARCHAR(20),
	   `t_name` VARCHAR(20) NOT NULL DEFAULT '',
	   PRIMARY KEY(`t_id`)
);

CREATE TABLE `score`(
       `s_id` VARCHAR(20),
	   `c_id` VARCHAR(20),
	   `s_score` INT(3),
	   PRIMARY KEY(`s_id`, `c_id`)
);


INSERT INTO student values('1001', 'zhaolei', '1990-1001-1001', 'male');
INSERT INTO student values('1002', 'lihang', '1990-12-21', 'male');
INSERT INTO student values('1003', 'yanwen', '1990-1005-20', 'male');
INSERT INTO student values('1004', 'hongfei', '1990-1008-1006', 'male');
INSERT INTO student values('1005', 'ligang', '1991-12-1001', 'female');
INSERT INTO student values('1006', 'zhousheng', '1992-1003-1001', 'female');
INSERT INTO student values('1007', 'wangjun', '1990-1007-1001', 'female');
INSERT INTO student values('1008', 'zhoufei', '1990-1001-20', 'female');

-- 课程表测试数据
INSERT INTO course values('1001','chinese','1002');
INSERT INTO course values('1002','math','1001');
INSERT INTO course values('1003','english','1003');

--教师表测试数据
insert into teacher values('1001','Frank Li');
insert into teacher values('1002','Tom Hansome');
insert into teacher values('1003','Jim Green');

--成绩表测试数据
INSERT INTO score values('1001', '1001', 80);
INSERT INTO score values('1001', '1002', 90);
INSERT INTO score values('1001', '1003', 99);
INSERT INTO score values('1002', '1001', 70);
INSERT INTO score values('1002', '1002', 60);
INSERT INTO score values('1002', '1003', 80);
INSERT INTO score values('1003', '1001', 80);
INSERT INTO score values('1003', '1002', 70);
INSERT INTO score values('1003', '1003', 70);
INSERT INTO score values('1004', '1001', 50);
INSERT INTO score values('1004', '1002', 30);
INSERT INTO score values('1004', '1003', 20);
INSERT INTO score values('1005', '1001', 76);
INSERT INTO score values('1005', '1002', 87);
INSERT INTO score values('1006', '1001', 31);
INSERT INTO score values('1006', '1002', 34);
INSERT INTO score values('1007', '1001', 89);
INSERT INTO score values('1007', '1002', 98);


mysql school <school.sql

grant all on school.* to dbuser@'localhost' identified by '123456';

mysql -u dbuser -p -h localhost -D school

mysql -udbuser -p123456 -h localhost -D school -e "select * from student;"



students.txt:

1001    zhaolei 1990-1001-1001  male
1002    lihang  1990-12-21      male
1003    yanwen  1990-1005-20    male
1004    hongfei 1990-1008-1006  male
1005    ligang  1991-12-1001    female
1006    zhousheng       1992-1003-1001  female
1007    wangjun 1990-1007-1001  female
1008    zhoufei 1990-1001-20    female

从 linux 本地文件 (最好是 tab 分割) 导入数据到 mysql 表

create table student1 like student;

#!/bin/bash

user=dbuser
password=123456
host=localhost
db=school
tab_name=student

cat students.txt |while read sid sname sbirth sgender
do
conn_mysql=`mysql -u"$user" -p"$password" -h $host -D $db -e "INSERT INTO student1 values('$sid','$sname','$sbirth','$sgender')"`
done



到处数据库中的数据 mysqldump

mysqldump -udbuser -p123456 -hlocalhost school >school_dump.sql

mysqldump -udbuser -p123456 -hlocalhost school student >student_dump.sql

### dump 导出 并 ftp 传输备份

#!/bin/bash

user=dbuser
password=123456
host=localhost
db=school
tab_name=score
out_file="$db"_"$tab_name"_name.sql

ftp_server=192.168.184.3
ftp_user=ftpuser
ftp_password=ftppsw
dst_dir=/data/backup/

if [ -n $tab_name ];then
    echo "$out_file"
    mysqldump -u"$user" -p"$password" -h"$host"  "$db" "$tab_name" > "$out_file"
    ftp -in << EOF
            open "$ftp_server"
            user "$ftp_user" "$ftp_password"
            cd "$dst_dir"
            put "$out_file"
            bye
EOF
fi

并配合 crontab  定时任务 即可 完成相对复杂的运维工作

精通shell编程--最后的总结第7张

精通shell编程--最后的总结第8张
精通shell编程--最后的总结第9张

添加开机自启动

  step 0 create a shell script

#!/bin/bash
cd /opt/jintel/modeler/ && sudo nohup java -jar ml-plugin-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
    step 1 copy shell script and add execute permission

sudo cp start_modeler.sh /etc/rc.d/init.d/
cd /etc/rc.d/init.d/
sudo chmod +x start_modeler.sh
    step 2 add chkconfig info
vim or gedit start_modeler.sh add chkconfig and description as below

add chkconfig info
#!/bin/bash
# chkconfig: 2345 10 90
# description: aiwebservice
cd /opt/jintel/modeler/ && sudo nohup java -jar ml-plugin-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &

    step 3  config auto start on server restart

sudo chkconfig --add start_modeler.sh
 
sudo chkconfig start_modeler.sh on

关闭端口命令 开启 端口命令

    sudo iptables -I INPUT -p tcp --dport [port] -j ACCEPT
  
    iptables -A OUTPUT -p tcp --dport 端口号-j DROP

    如 sudo iptables -I INPUT -p tcp --dport 8080 -j ACCEPT 开放8080端口

查看端口号状态 netstat -nat | grep 8080

service iptables save 保存设置

查看所有开启端口
查询 netstat -anp  所有开放端口信息



curl -X POST  -H "Content-type: application/json"   http://xxx:8999/MachineLearning/Result -d '{ "model_id":1874}' -w 'time_connect %{time_connect}
time_starttransfer %{time_starttransfer}
time_total %{time_total}
'

数据泄露

免责声明:文章转载自《精通shell编程--最后的总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Centos7 远程登录端口22 设置jquery hover事件只触发一次动画下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux-软件包管理-rpm命令管理-校验、文件提取

rpm -V httpd 查看已安装的apache包中文件信息是否已经被人修改 rpm -ql httpd 查看已安装的apache包中文件的位置 vim /etc/httpd/conf/httpd.conf 编辑修改apache包的配置文件httpd.conf 在命令模式下输入"402G",跳转到402行 在命令模式下输入"A",然后在插入...

DataGrid控件用法

实现模版列有超连接外观,一点实现打开或者下载的功能。 <ItemTemplate><a href='http://t.zoukankan.com/download.aspx?DocTitle=<%# DataBinder.Eval(Container.DataItem,"DocTitle") %>'> <%# Dat...

建行互联网银企被扫支付

背景 最近在对接建行的支付,我们做的是被扫支付,就是B扫C,一开始对方发了一个压缩包给我,看起来挺齐全的,文档、demo啥的都有,以为很简单,跟微信支付宝类似,调一下接口,验证一下就OK了。然而,事实证明我还是太年轻了。而且网络上你能够搜到的基本上都用不了,所以记一下博客,或许可以帮助其他人。 先说一下建行支付比较特殊的地方吧 1、官方提供的demo里面,...

kafka springboot (或 springcloud ) 整合

狂创客圈 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 + 面试必备 + 面试必备 【博客园总入口 】 疯狂创客圈 经典图书 : 《SpringCloud、Nginx高并发核心编程》 大厂必备 + 大厂必备 + 大厂必备 【博客园总入口 】 入大厂+涨工资必备: 高并发【 亿级流量IM实战】 实战系列 【 Sprin...

spark 2.X 疑难问题汇总

当前spark任务都是运行在yarn上,所以不用启动长进程worker,也没有master的HA问题,所以主要的问题在任务执行层面。 作业故障分类故障主要分为版本,内存和权限三方面。 - 各种版本不一致 - 各种内存溢出 - 其他问题 版本不一致1)java版本不一致报错:java.lang.UnsupportedClassVersionError: co...

【java虚拟机】jvm内存模型

作者:pengjunlee原文链接:https://blog.csdn.net/pengjunlee/article/details/71909239 目录 一、运行时数据区域   1、程序计数器   2、Java 虚拟机栈   3、本地方法栈   4、Java 堆   5、方法区   6、运行时常量池   7、直接内存 二、OutOfMemoryErro...