shell 脚本记录

这篇博客介绍了Shell脚本中的变量替换方法,包括从头和从末尾删除匹配部分,以及替换旧字符为新字符。还讲解了变量测试、字符串处理,如计算字符串长度、查找字符位置。此外,还涵盖了命令替换、算数运算、命令过滤、进程管理、变量类型定义以及正整数判断。最后,讨论了grep、find、sed、awk等命令的用法,包括文件过滤、内容查找、流编辑和模式匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

变量替换

1.${变量#匹配规则}  #从头开始匹配,最短删除。

2.${变量##匹配规则} #从头开始匹配,最长删除。

3.${变量%匹配规则} #从末尾开始匹配,最短删除。

4.${变量%%匹配规则}#从末尾开始匹配,最长删除。

5.${变量/旧字符/新字符}#匹配第一个旧字符并且替换。

6.${变量//旧字符/新字符}#匹配所有旧 字符并且替换。

举例使用echo ${var#*is}

变量测试

var=${str-expr} 若str未定义则取值expr ;若str定义了“”或者其他值则取值其他定义的值;

字符串处理

计算字符串长度

1.${#String} 2.expr lenth $String

计算字符在字符串中的位置

expr index "$var1" start  若包含start则按start查找 若不包含则按照字符查找第一个字符为准。

若赋值expr 则len=`expr index "$var1" start` 对一个不是单引号 是反斜线

匹配字符串在字符串中的位置

expr match "$var1" start 匹配字符串中的位置 从头开始匹配

输出系统下所有用户的

cat /etc/passwd | cut -d ":" - f 1  (cat 查看passwd文件 cut 指定分隔符为: -f 指定第一个分隔的内容)

shell命令替换与算数运算

1.· · 双反斜线命令替换 

2.$( ) 引用命令替换

3.$(()) 双括号算数运算

shell命令过滤 不想看见的命令 shell命令过滤后打印出来的进程有几行

grep -v 不想看见的东西   看有几行wc -l

shell关闭摸个进程 

systemctl stop nginx 关闭nginx进程

shell定义变量类型

declare typeset

declare -r 变量声明为只读类型  取消使用+r

declare -i 声明int变量 声明接收值的类型

declare -f 显示系统定义好的方法函数 显示函数内容

declare -F 显示系统定义好的方法函数 不显示函数内容

declare -a 定义array数组

declare -x 声明环境变量  声明变量后该变量可以在脚本中引用而不局限于当前终端有效

shell判断是否为正整数

通过将数值相加整数值 并指向dev/null

$num + 0 &>/dev/null  

flag=true
read -p "please input a number:" num
while $flag
do
   expr $num + 0 &>/dev/null
   [ $? -eq 0 ] && flag=false || read -p "please input a integer:" num
done

shell 在边界脚本中加入$$打印子进程:
shell将输出内内容放入到垃圾桶 &>/dev/null 然后只保存返回值 不过问题较多不建议使用

使用$?接取上方命令的返回值

shell 获取脚本详细执行过程 sh -x demo.sh

shell 查看当前目录 

pwd    which source

shell 查看系统内存使用情况与查看磁盘使用情况

free -m    df-h

shell   grep的使用 过滤文件里面的内容

grep  [内容] [文件名]     例如 grep shell ok.txt

-v 表示反选

-i 表示 忽略大小写

-n表示 显示行号

-E表示支持扩展

-F 表示支持正则表达式

-r 递归搜索

shell 命令之选项操作

find 【路径】【选项】【操作】

find ./ -name 'ok*'    表示在当前目录搜索开头为ok的内容 ,这里需要用单引号引入而不是反斜线

find /etc -mtime -5 -name '*.conf'  查找etc目录下5天修改且以conf为结尾的文件

这里添加条件可以直接附加添加条件。

-5 表示时间范围之内 +5表示时间范围之外的 

-size 表示按照文件大小查找 -1M 表示小于1M的文件, +1M 表示大于1M的文件

find . -path ./demo1 -prune -o -type f 表示过滤demo1文件搜索 -prune -o -p 为固定格式写错报错

find 命令操作完成后继续其他操作的命令-exec

例如 find ./etc -size =1M -exec cp {} ./test_5/ \; 大括号表示前段命令执行获得的内容(注意后面需要加  \: 而且该组合之前需加空格)

删除7天以前的日志

find /var/log -name '*.log' -mtime +7 -exec rm -rf {} \;

-name 表示指定文件名 -exec 指定第二段操作命令 {}表示上端的命令执行结果  \; 反斜杠*号表示固定格式

逻辑运算符 -a -o -not|!  与 或 非

-exec 与 -ok的区别 就是提示与不提示的区别 -ok会提示是否 y

find与locate 命令的区别 find命令是在整块磁盘中搜索 locate命令是在数据库文件中查找

find是每人全部匹配 locate默认是部分匹配

linux数据库更新

/var/lib/mlocate/mlocate.db 表示linux数据库下的文件操作记录数据库

更新数据库 updatedb 更新时间比较长 数据更新后 使用locate a.txt

查找可执行文件命令 二进制 which mysql 

查找可执行文件帮助文档 whereis mysql

locate 查找单个文件 查找速度快

linux shell 之 sed命令 流编辑器

第一种形式 stdoud | sed [option] "pattern command"

第二种形式 sed [option] "pattern command" file     例如(sed -n '/ok/p' sed.txt)

sed ‘p’ sed.txt  p是打印输出 打印两遍 本身一遍 输出一遍

sed -n sed.txt p 静默打印 只打印输出

sed -n -e '/ok/p' -e '/oks/p sed.txt   -e表示指定pc模式 多个需要加-e 单个不需要加

sed -n -f edit.sed sed.txt  -f表示将pc写入指定文件中进行匹配

sed -n -r '/python|PYTHON/p' sed.txt  -r表示支持扩展中的表达式

sed -n 's/love/like/2g' sed.txt     1g 2g ig   /g表示替换全部 /2g 便是从第二个开始替换全部 /ig表示忽略大小写替换

=表示只显示行号

sed -n 's/love/like/g' sed.txt s/    /g 表示固定格式 s是要被替换的 g表示替换的,例如(sed -n 's/love/like/g' sed.txt)

以上操作无法修改文件内容 需要使用-i 加上该参数就可以 了。-n -i 无法会导致文件被清空

sed -n '/ok/,10' sed.txt 文件的匹配行号模式^表示为脱字符 表示为以什么什么为开头。

sed编辑命令用法

查询

1.p --------打印   2.d-------删除  

增加

3.a  -----匹配到行后追加内容

4.i  ------匹配到行前追加内容

5.r ------将后面指定文件的内容追加到匹配的行的后面(将文件内容追加到后面)

6.w------将匹配到行的内容另存到其他文件中(匹配文本内容并保存到其他行)

修改

sed 之反向引用 

sed -i 's/had..p/&s/g' sed.txt   &表示引用之前的内容

echo sed使用举例说明 echo "`sed -n '/\['$1'\]/,/\[.*\]/p' $filename`" 在引用其他变量的时候不可放在'单引号中'需要隔离出来

vim ok.txt 进入文件编辑的时候   使用/搜索的内容超找文件内容

awk 'BEGIN{} pattern {command} END{}' awk大约可以分为4个部分 BEGIN{} pattern 匹配规则 command命令执行

 

END{}结束部分

awk 'BEGIN{FS=":"} {print $1}' passwd  FS表示指定分隔符 $1表示分隔后的第一个字符(passwd为操作文件)

如果没有设置FS分隔符则默认按照空格来设置分隔符 

例如 awk 'BEGIN{print $1}' passwd

NF 的使用指定字段个数 分隔符空格  分隔成的个数 例如awk '{print NF}' passwd

NR 表示输出该文件的行号  例如awk '{print NR}' passwd

FNR 表示多行文件的行号输出 例如 awk'print FNR' passwd ok.txt

表示分别输出后面2个文件的行号

初始文本内容为java|python|c++--mklie|jay|clili--apple|bear

awk 处理结果为 awk 'BEGIN{RS="--";FS="|"} {print $1}' awktest.txt  RS表示纵向的分隔符默认为换行符

FS表示文件的横向分隔 2个命令之间用;分隔 上图为组合的用法

ORS输出纵向分隔符 awk 'BEGIN{RS="--";FS="|";ORS="*"} {print $1}' awktest.txt

输出结果如下java*mklie*apple*

OFS输出横向分隔符  awk 'BEGIN{RS="--";FS="|";ORS="*";OFS="|"} {print $1,$2}' awktest.txt

printf 格式说明 %s 字符 %d 打印10进制整数

printf 的用法 awk 'BEGIN{FS=":"} {printf" %s\n",$1}' passwd   指定输出的类型  输出多个需要,分隔

awk 逻辑运算比较大小命令 awk 'BEGIN{FS=":"}$3<50{print $0}' passwd  备注==号可用于数字或者字符串判断

awk 正则匹配awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print$0}' passwd  备注 ~//为匹配正则表达式固定写法  释义 匹配第三段字符

0-9的并匹配三次

awk 'BEGIN{FS=":"}$1=="root"||$1=="liyuan"{print $0}' passwd 备注 基于关系运算符

awk条件语句 if

awk 'BEGIN{FS=":"}{if($3<50) print $1}' passwd  备注 找出文件中的小于50的并输出$1

awk 指定awk文件执行脚本 awk -f userpawd.awk passwd    备注-f为引用

userpawd.awk 文件内容如下
  1 BEGIN{
  2 FS=":"
  3 }
  4 
  5 {
  6 if($3<50)
  7 {
  8 printf "%-10s%-5d\n",$1,$3
  9 }
 10 }
注意事项  BEGIN 标签后面需要直接接大括号不可换行 左右对齐需要在%与s之间(类似)

awk 数据计算运算符

awk 'BEGIN{x=20;y=2;print x^y}'  ^脱字符与**表示 多少次方 

index的用法

awk 'BEGIN{str="I have a dream "; loc=index(str,"a") ; print loc }'

awk中常用选项

-v 传递参数(引入外部变量) -f引用脚本文件 -F指定分隔符 -V查看awk版本

shell中数组的操作

shell与awk命令数组的区别 shell下标是从0开始的 awk下标是从1开始的

array={"a"  "b"  "c" "d"}   修改数组中的元素array[1]="c" 

输出数组中的位置 shell引用下标为之前的存储下标

mysql数据库操作分配权限

grant all  on school .* to dbuser@'%'  identified by '12356' 备注注释 分配all表示所有权限 在数据库school 中 @'%'表示

所有人 id表示设置密码

yum 下载安装软件包

yum install mariadb  mariadb-server mariadb-libs-y   安装需要的软件包(例如安装mysql)

网络端口监听

netstat -tnlp|grep :3306  过滤网络监听接口

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值