Bash学习
shell基础
-
在包含某个关键字的行上面插入一行文字,命令如下:
sed -i '/hello/i\1234' testfile
执行完命令后,会将i后面反斜杠后面的内容插入到包
含hello关键字行的上面
-
在包含某个关键字的行下面插入一行文字,命令如下:
sed -i '/hello/a\4567' testfile
执行完命令后,会将a后面反斜杠后面的内容插入到包含hello关键字行的下面
-
在指定行插入数据
sed '3 apassword' -i a.txt 在第三行后面添加 password 前面是ipassword
-
IP=
ip a |grep brd |grep eno16777736 | awk '{print $2}' |awk -F '/' '{print $1}'
sed -i 's/remove/'$IP'/g' /home/mysql_install.sh -
sed -i '1d' name.txt 删除第一行
sed -i '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 'NRFNR{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.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=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=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开头
- 如果给定字符串 variable="User:123:321:/home/dir",如何只用 echo 命令获取 home_dir ?
echo ${variable#:😗:}
或
echo ${variable##*:}
[ $a == $b ] - 用于字符串比较
[ $a -eq $b ] - 用于数字比较
- 如何从上面的字符串中获取 “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 ? 就是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+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 varip/g' /home/uinnova/read.sh
if [ $? -eq 0 ]
then
echo -e "修改IP成功"
else
echo -e "修改IP失败"
fi
else
echo -e "修改配置文件失败"
fi