您的位置:首页 > 运维架构 > Shell

常用linux命令及shell脚本

2017-06-11 22:28 645 查看
参考:Linux命令大全

分割大文件

Split命令

按行分割(只能是文本文件)

$split -l 1000 big_file  前缀


按文件大小分割

$split -b 64m big_file 前缀

文本合并

#a.txt
a
b
c

#b.txt
1
2
3


追加文本

$cat a.txt >> b.txt

结果:
a
b
c
1
2
3


逐行合并

$ paste a.txt b.txt

结果
a 1
b 2
c 3

通过
-d
参数可以制定分隔符额

$paste -d: a.txt  b.txt

结果
a:1
b:2
c:3

排序去重

#a.txt
1
2
4
4
3
4


简单排序

$sort a.txt

结果
1
2
3
4
4
4

参数
-n
使用数字排序,
-t
制定分隔符,
-k
制定排序采用的key值,
-r
逆序

排序去重(重复的只保留一个)

$sort -u a.ttx



$cat a.txt | sort | uniq

结果
1
2
3
4


排序去重(重复的一个不留)

$cat a.txt | sort | uniq -u

结果
1
2
3

处理图片


以来外部程序`
sudo apt-get install imagemagick


Examples of ImageMagick Usage



更改图片格式

$convert a.png [-quality 95] b.jpg


更改图片尺寸

$convert a.png -resize 200×100 b.png #处理为200x100的图片(不精确)

$convert a.png -resize 200×100! b.png #处理为200x100的图片(精确)

$convert a.png -resize 200 b.png #处理为宽为200的图片(保持纵横比)

$convert a.png -resize ×100 b.png #处理为高100的图片(保持纵横比)


旋转图片

$convert a.jpg -rotate 90 b.jpg


炭笔画效果

$convert a.jpg -charcoal 2 b.jpg


内爆效果

$convert a.jpg -implode 1 b.jpg


批量处理图片

$for pic in *.png; do convert $pic -rotate 90 rotated-$pic; done

ssh登录

利用expect自动登录

#服务器登陆脚本

# 服务器用户名
ARR_SERVER_USER=(
[0]='root'
[1]='guest'
)

# 服务器IP地址
ARR_SERVER_HOST=(
[0]='xx.xx.xx.xx'
[1]='xx.xx.xx.xx'
)

# 服务器SSH端口号
ARR_SERVER_PORT=(
[0]='22'
[1]='22'
)

# 服务器SSH密码,密钥登陆的值设置为 NULL
ARR_SERVER_PASSWORD=(
[0]='PASSWORD'
[1]=NULL
)

# 服务器说明
ARR_SERVER_COMMENT=(
[0]='密码登陆'
[1]='秘钥登陆'
)

# 密钥文件地址. 如果是密钥登陆的话, 值为密钥文件地址. 否则为 NULL
ARR_SERVER_KEY=(
[0]=NULL
[1]='/path/xxx.pem'
)

# 统计服务器台数,方便遍历输出
LEN=${#ARR_SERVER_USER[@]}

# 屏幕输出提示信息。显示服务器序号、主机地址、说明信息
screen_echo() {

printf "%-7s |" '序号'
printf "%-18s |" '主机'
printf "%-30s\n" '说明'

for((i=0; i<$LEN; i++))
do
printf "\e[31m %-5s\e[0m|" "$i" # 颜色为红色
printf "%-15s |" "${ARR_SERVER_HOST[$i]}"
printf "%-30s\n" "${ARR_SERVER_COMMENT[$i]}"
done

}

# 调用函数,让信息显示出来
screen_echo

while true
do

# 让使用者选择所需要登陆服务器的所属序号
read -p '请输入要登陆的服务器所属序号: ' SERVER_NUM

# 如果输入为空格或者回车,显示错误信息,后续代码不再执行,重新循环。
if [ ! ${SERVER_NUM} ]
then
echo '请输入序号'
continue
fi

# 如果输入的不是数字,显示错误信息,后续代码不再执行,重新循环。
if [[ "${SERVER_NUM}" =~ [^0-9]+ ]]
then
echo '序号是数字'
continue
fi

# 如果输入的以 0 开头的数字、大于等于服务器台数、小于 0,显示错误信息,后续代码不再执行,重新循环。
if [[ "${SERVER_NUM}" =~ ^0[0-9]+ ]] || [ ${SERVER_NUM} -ge ${LEN} ] || [ ${SERVER_NUM} -lt 0 ]
then
echo '请输入存在的序号'
continue
fi

# 跳出循环
break

done

# 登陆的函数
# set timeout 设置超时时间。-1 永不超时
# spawn : -noecho 意思为终端中不显示 spawn .. ssh ... 等信息,不加此参数会有输出; -o StrictHostKeyChecking=no 不提示认证
# $1、$2、$3、$4 代表调用函数是所传输的第一个、第二个、第三个、第四个参数值
# *yes/no*  意思为 ssh 后如果返回的信息当中包含 yes/no,而 *password* 就是代表 ssh 后如果返回的信息当中包含 password
# send 意思为发送信息
# exp_continue 意思为继续执行下面的匹配
# interact 意思为留在远程终端上面。如果不写此语句,自动退出服务器
auto_login_ssh () {

if [ NULL = $5 ]
then
expect -c "
set timeout 10;
spawn -noecho ssh -o StrictHostKeyChecking=no $1@$2 -p $3;
expect {
*yes/no* {
send yes\r
exp_continue
}
*password* {
send $4\r
}
}
interact
";
else
expect -c "
set timeout 10;
spawn -noecho ssh -o StrictHostKeyChecking=no -i $5 $1@$2;
interact
";
fi;

return 0;
}

# 调用登陆函数并传值。用户名、地址、端口号、密码
auto_login_ssh ${ARR_SERVER_USER[$SERVER_NUM]} ${ARR_SERVER_HOST[$SERVER_NUM]} ${ARR_SERVER_PORT[$SERVER_NUM]} ${ARR_SERVER_PASSWORD[$SERVER_NUM]} ${ARR_SERVER_KEY[$SERVER_NUM]}

压缩打包/解压缩

根据进程名杀死进程

$ `ps -ef | grep $proc_name | grep -v grep | awk '{print "kill " $2}'` | sh

监控进程(自动重启)

#!/usr/bin/env bash

#定时检查指定名称的进程是否存在,若不存在,重新启动

proc_name="程序名称"
log_name="./auto_restart.log"
pid=0

proc_num()
{
num=`ps -ef | grep $proc_name | grep -v grep | wc -l`
return $num
}

proc_id()
{
pid=`ps -ef | grep $proc_name | grep -v grep | awk '{print $2}'`
}

count=0
while (true)
do
proc_num
number=$?
if [ $number -eq 0 ]
then
#此处填写重启命令
proc_id
count=$[count+1]
echo $count:'Restart' >> $log_name
echo ${pid}:`date` >>  $log_name
sleep 2m

fi
done

例行任务

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: