Bash学习

shell基础

  1. 在包含某个关键字的行上面插入一行文字,命令如下:

    sed -i '/hello/i\1234' testfile

    执行完命令后,会将i后面反斜杠后面的内容插入到包

    含hello关键字行的上面

  2. 在包含某个关键字的行下面插入一行文字,命令如下:

    sed -i '/hello/a\4567' testfile

    执行完命令后,会将a后面反斜杠后面的内容插入到包含hello关键字行的下面

  3. 在指定行插入数据

    sed '3 apassword' -i a.txt 在第三行后面添加 password 前面是ipassword

  4. IP=ip a |grep brd |grep eno16777736 | awk '{print $2}' |awk -F '/' '{print $1}'
    sed -i 's/remove/'$IP'/g' /home/mysql_install.sh

  5. sed -i '1d' name.txt 删除第一行
    sed -i 'dname.txtsedi1,d' name.txt 删除最后一行 sed -i '1,d' name.txt 删除第一至最后一行
    sed -i '^$' name.txt 删除空行
    sed -i '/empty/' name.txt 删除包含empty的行

    sed -i 's/192/199/1' name.txt 替换匹配的第一个v
    sed -i '/empty/r /etc/hosts' name.txt //r是匹配文件内容,在查找项目后匹配入文件
    sed -i '/empty/ {n;s/name/NAME/g}' name.txt //对匹配项的下一行进行修改

处理变量

比较两个文本的内容异同
找出不同点:
awk 'NRFNR{a[$0]++}NR>FNR&&!a[$0]' 少.txt 多.txt
找出相同点:
awk 'NR
FNR{a[$0]++}NR>FNR&&a[$0]' 多.txt 少.txt
删除带有特殊字符的行
:g/***/d

生成随机数
aa=$((RANDOM%99999)) //最大是五位数

比较两个文件中,某固定位置是否相同


sed -n '1,4p' 1.txt >a.tmp
sed -n '1,3p' 2.txt >b.tmp
diff a.tmp b.tmp >diff.tmp

for i in $(cat b.txt); do
for j in $(cat a.txt); do
if [ $j -eq $i ]
then
echo $i
fi
done
done

####提取文件特征值####用作参考文件配置是否替换
filename=find /u01/*/engine/workdir/ -name Pattek.lic
for i in $filename
do
md5sum $i
done
echo "finish"

vim :6000 跳转到6000行
vim 中ctrl+v 列编辑模式,编辑起来特别方便 选中后按x键删除
建立用户到指定目录下:useradd -d /usr/local/dyh dyh

grep -i "file"1.txtgrepve"">>new2.txt//1grepi"file" 1.txt | grep -v -e "--" >>new2.txt //查找1文件中存在的名称,并赋给新文件中 grep -i "file" 1.txt | grep -v -e "--" >>new2.txt //查找文件以及其下面一个文件
grep -A 10 "soucename" 1.txt //检索出1.txt文件中目标及其后续十行


6、AWK
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1642/sshd //实例
netstat -lntp |grep sshd |awk '{print NF}' //统计有几列 7
netstat -lntp |grep sshd |awk '{print $NF}' //打印最后一列 1642/sshd
netstat -lntp |grep sshd |awk '{print (NF-1)}' //倒数第二列 LISTEN netstat -lntp |grep sshd |awk '{print substr(NF,6)}' //substr函数匹配字符串 输出结果 sshd
cat 1.txt | awk '/^\s*$/{print NR}' //打印空的行号 33332
cat 1.txt | grep -n '''' //给文本内容加行号

shell中的小数的乘法
dd=(echo"scale=2;1000(echo "scale=2;1000*aa"|bc)
echo "7.88*1999" |bc

windows文本文件传至Linux中时,由于编码问题提示xxx.txt下内容的\r的文件状态(stat)
vim -b xxx.txt
:%s/\r//g
替换即可

检测文件更新
a=stat -c %Y filename;//检测文件最新更新时间
b=date +%s; //系统时间
if [ $[ $b - $a ] -gt 60 ];
then command;
else :;
fi

split 分割大文件
split -b 3000m 33.tar.gz 01_33.tar.gz //每3G分割一次
cat * > 33.tar.gz //合并

时间格式转换
/finddate -d '2013-2-22 22:14' +%s //转为uinx时间戳
date -d @1361542596 +"%Y-%m-%d %H:%M:%S"

路由的添加
route -n //查看路由表
route add default gw 192.168.1.100
route del default gw 192.168.1.100

lsof -i:22 //查看端口信息
let
V1=1
V2=2
let V3=V1+V1+V2
echo $V3

find / -name .sh -type f -mtime +7 exec rm -rf {} ;
find / -name name
-type f -mtime +30 |xargs rm -rf
意思是查找 -type f find命令查找的普通文件

A=ther --`赋值意思,将ther赋值给A

if [[ $string == abc* ]];then检查字符串是否以abc开头

  1. 如果给定字符串 variable="User:123:321:/home/dir",如何只用 echo 命令获取 home_dir ?

echo ${variable#:😗:}

echo ${variable##*:}

[ $a == $b ] - 用于字符串比较
[ $a -eq $b ] - 用于数字比较

  1. 如何从上面的字符串中获取 “User” ?

echo ${variable%::😗}

sed命令
sed -i '3d' 001.txt --删除001.txt文件中第3行内容
sed -i '128s#/uinnova/tarsier/#/uinnova/#g' 001.txt --将001.txt文件中的128行的路径替换

$? 上个命令的退出状态,或函数的返回值。
例子1 :
ls 命令没有找到匹配的结果. 所以返回2 $? 就是2
[root@sg-rhel6-17 etc]# ls /tmp/.log
ls: cannot access /tmp/
.log: No such file or directory
[root@sg-rhel6-17 etc]# echo ?22:ls.0? 2 例子2 : ls 命令找到了结果. 成功返回0 所以? 就是0
[root@sg-rhel6-17 etc]# ls /tmp/*.tmp
/tmp/reminder.tmp
[root@sg-rhel6-17 etc]# echo $?
0

alias cls=‘clear’设定命令指向
export cls 将cls命令导入至变量环境

env 查看系统变量

which mv 查看mv命令所在目录

vim /etc/profile 创建开机重载入 并以source执行刷新
echo "welcome to beijing"##登录显示信息

curl -o /dev/null -s -w %{http_code} www.linux.com 检查网页访问返回值

****mysql启动正常与否的shell检测
#!/bin/bash
mysqlpath=pwd
nohup ./bin/mysqld_safe --defaults-file=$mysqlpath/my.cnf>/dev/null 2>&1 &

sleep 2 含有grep的不输出 awk 执行当前文本中每一行的{}里面的语句
pid_list=ps -ef| grep "$mysqlpath/bin/mysqld" | grep -v grep | awk '{print $2}'

    -n "$pid_list"含有字符串时
    -e filename 存在文件
    -d "$pid_list" 存在目录
    -z  "$pid_list"[ -z STRING ] “STRING” 的长度为零则为真。
    -f  filename 常规文件

if [ ! -n "$pid_list" ];then
echo "mysql start failed!"
else
cd bin
echo "mysql start successfully!"
fi

echo -n 不换行输出
-e 遇到特殊字符。特殊处理
如:\f 换行但光标仍然停留在原来的位置
\r 不换行,光标移动至行首

1、touch hello.sh
vim hello.sh
#!/bin/bash
echo hello word! 等同于 echo "hello word!"

2、‘’不能解析变量;“”能解析变量;

3、整型测试
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
-eq:等于
-ne:不等于

字符串测试:
-z $xxx 判断xxx是否为空

4、 if语句
#!/bin/bash
a=1
db=2
if [(此处空格) a -gt b (此处空格)]
ds then
echo a large than b
else
echo a lower than b
fi

5、多分支if
if[ 条件1 ]
then
echo xxx
elif [ 条件2 ]
then
echo aaa
else
echo bbb
fi

6、case 语句
#!/bin/bash
read -p "press a key:" key
case $key in
[a-z]|[A-Z])
echo "it's a character"
;;
[0-9])
echo "it's a number"
;;
*)
echo "others"
esac

7、算数运算
#!/bin/bash
num=1
let num=num+1num=num+1 num=[num+1]num=num+1] num=(($num+1))
num=expr $num + 1
echo $num

8、逻辑运算符
-a 代表'与'&&
-o 代表'或'
! 非

if [$a -lt $b -a $c -gt $b ]

9、自定义函数
functiom func(){
echo this is a function
}
func

10、read
read -p "press enter:" xxx -p 输入提示命令
read -s -p "press password:" xxx 安全输入:输入密码时不显示

11、date
显示当前时间
date '+%Y-%m-%d %H:%M:%S'
echo date +%Y-%m-&d-%H:%M:%S 2018-08-24-20:09:00
指定时间输出
echo date --date='2019-01-01 11:11:11'
echo date --date='3 days ago'显示三天前时间

12、后台运行脚本
tesh.sh & 后台运行
nohup test.sh & 不挂断运行命令

13、标准输入、输出、错误、重定向
ls > /home/
ls 2 > /home/ 错误输出

14、函数调用

#/bin/bash

#write

function echo_green(){

       echo -e -n "\033[36m $1 \033[0m"
       sleep 5

}
echo_green "是否一键修改cupid-server中project.properties?(y/n)"

read answer

if [ $answer == "y" ];
then

      sed -i '15s/then/them/g' /home/uinnova/read.sh

echo_green "请输入IP;"
read -p "请输入IP:" varip echo varipsedi3s/write/varip sed -i '3s/write/varip/g' /home/uinnova/read.sh
if [ $? -eq 0 ]
then
echo -e "修改IP成功"
else
echo -e "修改IP失败"
fi

else
echo -e "修改配置文件失败"
fi