SHELL脚本和Sed等工具的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_43551152/article/details/83550486

SHELL脚本(重点 )

创建shell脚本
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!

.#!/bin/bash
添加注释
注释以#开头
第二步:运行脚本
给予执行权限,在命令行上指定脚本的绝对或相对路径
直接运行解释器,将脚本作为解释器程序的参数运行
脚本规范
脚本代码开头约定
1、第一行一般为调用使用的语言
2、程序名,避免更改文件名为无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、最后是各版本的更新简要说明
shell脚本示例

#!/bin/bash  
#------------------------------------------    
#Filename: hello.sh   
#Revision: 1.1    
#Date: 2011/06/01  
#Author: luhao 
#Email: [email protected]  
#Website: https://blog.csdn.net/weixin_43551152
#Description: This is the first script  
#------------------------------------------  
#Copyright: 2011
#License: GPL  
echo “hello world”  

.vimrc文件在根目录下,修改:vim .vimrc 文件
可以修改vim的脚本注释作者等信息


局部变量

变量赋值:name=‘value’
可以使用引用value:
(1) 可以是直接字串; name=“root”
(2) 变量引用:name="$USER"

(3) 命令引用:name=COMMAND name= ( C O M M A N D ) (COMMAND) 变量引用: {name} $name
“”:弱引用,其中的变量引用会被替换为变量值

’ ':强引用,其中的变量引用不会被替换为变量值,而保持原字符串
显示已定义的所有变量:set
删除变量:unset name
环境变量
变量声明、赋值:
export name=VALUE
declare -x name=VALUE
变量引用:$name, ${name}
显示所有环境变量:
env

printenv
export
declare -x
删除变量:
unset name
退出状态
进程使用退出状态来报告成功或失败
0 代表成功,1-255代表失败
$? 变量保存最近的命令退出状态
例如:
ping-c1-W1hostdown&>/dev/null
echo$?


算术运算

bash中的算术运算:help let
+, -, *, /, %取模(取余), **(乘方)
实现算术运算:
(1) let var=算术表达式
(2) var= [ ] ( 3 ) v a r = [算术表达式] (3) var= ((算术表达式))
(4) var= ( e x p r a r g 1 a r g 2 a r g 3... ) ( 5 ) d e c l a r e i v a r = ( 6 ) e c h o b c b a s h (expr arg1 arg2 arg3 ...) (5) declare –ivar= 数值 (6) echo ‘算术表达式’ | bc 乘法符号有些场景中需要转义,如* bash有内建的随机数生成器: RANDOM(0-32767)
echo [ [ RANDOM%50] :0-49之间随机数
增强型赋值:
+=, -=, *=, /=, %=
let varOPERvalue
例如:let count+=3
自加3后自赋值
自增,自减:
例子:

let var+=1  
let var++  
let var-=1  
let var--  
let n=1+2  
echo $n  
3  
n=$(2+3)  
2  
expr 3+4  错误  
expr 3 + 4  
7  
expr为命令  3+4为参数之间要有空格************************************  
echo $[RANDOM%100+1] 取1-100之间的随机数 **  
RANDOM为随机数,除以100得到的余数为0-99,+1后为1-100 *****  
echo $? 查询命令执行结果  

& 与 交集
| 或 并集
! 非
^ 异或 相同为0 不同为1
&& 短路与 两条命令,第一条为真,则执行第二天2条看真假,第一条为假的情况下直接不执行命令
|| 短路或 两条命令,第一条为假,则执行第二天2条看真假,第一条为真的情况下直接不执行命令
同或 相同为1 不同为0

[ “ s t r 1 " ! = " str1" !=" str2” ] 判断两个字符串是否相同
bash +x 加sh脚本可以看到脚本运行的过程,可以检查哪里出错
export +定义的变量可使该变量在子进程中也生效
find -name +文件名 查找文件或者安装包


bash的数值测试

-v VAR  
变量VAR是否设置  
数值测试:  
-gt是否大于  
-ge是否大于等于  
-eq是否等于  
-ne是否不等于  
-lt是否小于  
-le是否小于等于  
Bash的文件属性测试  

文件大小测试:

-s FILE: 是否存在且非空
文件是否打开:
-t fd: fd文件描述符是否在某终端已经打开
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
Bash的文件测试

存在性测试

-a FILE:同-e
-e FILE: 文件存在性测试,存在为真,否则为假
存在性及类别测试
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或-L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件


使用read命令来接受输入
使用read来把输入值分配给一个或多个shell变量
-p指定要显示的提示
-s 静默输入,一般用于密码
-n N指定输入的字符长度N
-d‘字符’ 输入结束符
-t N TIMEOUT为N秒
read从标准输入中读取值,给每个单词分配一个变量
所有剩余单词都被分配给最后一个变量
read -p “Enter a filename:“ FILE


bash如何展开命令行

把命令行分成单个命令词
展开别名
展开大括号的声明({})
展开波浪符声明(~)
命令替换$()和``)
再次把命令行分成命令词
展开文件通配(*、?、[abc]等等)
准备I/0重导向(<、>)
运行命令
防止扩展
反斜线(\)会使随后的字符按原意解释

$echoYourcost:$5.00

Yourcost:$5.00
加引号来防止扩展
单引号(’)防止所有扩展
$(美元符号)-变量扩展
`(反引号)-命令替换
\(反斜线)-禁止单个字符扩展
!(叹号)-历史命令替换


Profile类

按功能划分,存在两类:
profile类和bashrc类
profile类:为交互式登录的shell提供配置
全局:/etc/profile, /etc/profile.d/*.sh
个人:~/.bash_profile
功用:
(1) 用于定义环境变量
(2) 运行命令或脚本
Bashrc类
bashrc类:为非交互式和交互式登录的shell提供配置
全局:/etc/bashrc
个人:~/.bashrc
功用:
(1) 定义命令别名和函数
(2) 定义本地变量


locate命令

locate KEYWORD
有用的选项

-i不区分大小写的搜索
-n N只列举前N个匹配项目
-r 使用正则表达式
示例
搜索名称或路径中带有“conf”的文件
locate conf
使用Regex来搜索以“.conf”结尾的文件
locate -r ‘.conf$’

find******************************练习

查找条件
指搜索层级
-maxdepthlevel 最大搜索目录深度,指定目录为第1级
-mindepthlevel 最小搜索目录深度
先处理目录内的文件,再处理目录
-depth


根据文件名和inode查找:

-name “文件名称”:支持使用glob
*, ?, [], [^]
-iname"文件名称":不区分字母大小写
-inumn 按inode号查找
-samefilename 相同inode号的文件
-links n 链接数为n的文件
-regex“PATTERN”:以PATTERN匹配整个文件路径,而非文件名称


根据属主、属组查找:

-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uidUserID:查找属主为指定的UID号的文件
-gidGroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件


根据文件类型查找:

-type TYPE:
•f: 普通文件
•d: 目录文件
•l: 符号链接文件
•s:套接字文件
•b: 块设备文件
•c: 字符设备文件
•p: 管道文件
空文件或目录
-empty
find /app -type d -empty

find示例

备份配置文件,添加.orig这个扩展名

find -name “*.conf” -exec cp {} {}.orig\;  

提示删除存在时间超过3天以上的joe的临时文件

find/tmp-ctime+3-userjoe-okrm{}\;  

在主目录中寻找可被其它用户写入的文件

find ~-perm-002 -execchmodo-w{}\;   
find /home –type d -ls  

locate text.sh搜索文件
因为是从locate的数据库搜索文件的,速度快不影响服务器性能,适合搜索本来就在内存中的文件,而新建的文件不会马上搜索到,可以输入updatedb更新locate数据库
locata +"*通配符"搜索文件
locata -r ".sh$"搜索以.sh结尾的文件(支持正则表达式)
**find搜索是实时搜索,在硬盘上搜索,速度慢且影响服务器性能,而且没有权限的文件夹搜索不进去 ***********************(面试常有)
find (路径) -name(iname) "text"搜索包含text的文件+i后忽略大小写

例子

find -name "*.txt"  查找以txt结尾的文件  
find -empty 搜索空文件或者空目录  
find / -size 10k 搜索9-10k的文件  
find / -size -10k  搜索0-10k的文件  
find / -size +10k  搜索大于10k的文件  
find / -size +5k -size 10k 搜索5-10K的文件  
find -name "*.txt" -exec(批量) rm {} \; 查找后缀名为txt的文件并 批量 删除  

chmod a+x 文件 给所有人加上此文件的执行权限
ll -d 查询当前目录下的权限

处理文本的工具sed ********重点

sed工具
用法:

sed [option]... 'script' inputfile...  
常用选项:  
-n不输出模式空间内容到屏幕,即不自动打印  
-e多点编辑  
-f /PATH/SCRIPT_FILE从指定文件中读取编辑脚本  
-r支持使用扩展正则表达式  
-i.bak备份文件并原处编辑  

script:
‘地址命令’
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
.#: 指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
.#,#
.#,+#
/pat1/,/pat2/
.#,/pat1/
(4) ~:步进

编辑命令:

d删除模式空间匹配的行,并立即启用下一轮循环
p打印当前模式空间内容,追加到默认输出之后
a[\]text在指定行后面追加文本,支持使用\n实现多行追加
i[\]text在行前面插入文本
c[\]text替换行为单行或多行文本
w /path/file保存模式匹配的行至指定文件
r /path/file读取指定文件的文本至模式空间中匹配到的行后
=为模式空间中的行打印行号
!模式空间中匹配行取反处理

SED笔记*******************练习

SED

用法: 不加-i时仅仅是打印到屏幕显示,加-i可以修改文件,一般加-i.bak备份一个.bak文件

sed[option]... 'script' inputfile...  
常用选项:  
-n不输出模式空间内容到屏幕,即不自动打印  
-e多点编辑  
-f /PATH/SCRIPT_FILE从指定文件中读取编辑脚本  
-r支持使用扩展正则表达式  
-i.bak备份文件并原处编辑  
编辑命令:  
d删除模式空间匹配的行,并立即启用下一轮循环  
p打印当前模式空间内容,追加到默认输出之后  
a` [\]`text在指定行后面追加文本,支持使用\n实现多行追加  
`i[\]`text在行前面插入文本  
`c [\]`text替换行为单行或多行文本  
w /path/file保存模式匹配的行至指定文件  
r /path/file读取指定文件的文本至模式空间中匹配到的行后  
=为模式空间中的行打印行号  
!模式空间中匹配行取反处理  

例子

sed ‘2p’ /etc/passwd  
sed –n ‘2p’ /etc/passwd  显示第2行  
sed –n ‘1,4p’ /etc/passwd  显示1-4行  
sed –n ‘/root/p’ /etc/passwd  显示带有root的行  
sed –n ‘2,/root/p’ /etc/passwd  从2行开始  
sed -n ‘/^`$`/=file 显示空行行号  =代表行号   
sed –n –e ‘/^$/p’ –e ‘/^$/=file  
sed –n –r '/^#|^$/d' + file 删除该文件中带#注释和空白的行  
sed ‘/root/a\superman’ /etc/passwd行后  
sed ‘/root/i\superman’ /etc/passwd行前  
sed ‘/root/c\superman’ /etc/passwd代替行  
s///查找替换,支持使用其它分隔符,s@@@,s###  

替换标记:
g行内全局替换
p显示替换成功的行
w /PATH/FILE将替换成功的行保存至文件中
nl 可以显示行号


实例

sed -n '/^u/p'  /data/f1  打印出data下的f1文件中以u开头的行  
sed -n '3,9'只显示3-9行  
sed -n '/^ftp/,/^lib/' passwd 显示passwd文件中以ftp开头和以lib开头之间的行  
sed -n '1~2p' 打印奇数行  
sed -n '2~2p' 打印偶数行  
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config  把config文件中的SELINUX=enforcing改为SELINUX=disabled  禁用selinux   
sed -n 's/tmpfs/tempfilesystem/g' /etc/fstab 将文件fstab中的tmpfs替换为  tempfilesystem,并且只显示替换结果,s为查找替换,p为只显示替换的那一行  
sed -r 's/[[:alpha:]]/\u&/g' +文件 [[:alpha:]]意思为字母,u为大写,&表示搜索到的内容,用u&替换原内容,把所有的字母替换为大写  
sed -r 's/[[:alpha:]]/\l&/g' +文件 [[:alpha:]]意思为字母,l为小写,&表示搜索到的内容,用u&替换原内容,把所有的字母替换为小写  
sed -r 's/^[^#]/#&' +文件 将文件中不是#开头的行加上#并显示,其中&代表被搜索出来的内容,等于用#&替换了原来的内容,加-i可以直接修改 .............................(重点)  
sed -nr '/.*CMDLINE_LINUX.*/s#(.*)"#\1 net.ifnames=0"#p' /etc/default/grub   在带有CMDLINE_LINUX的一行后加上net.ifnames=0  仅在7系统需要修改    ......................修改  
s///查找替换,支持使用其它分隔符,s@@@,s###  

替换标记:
g行内全局替换
p显示替换成功的行
w /PATH/FILE将替换成功的行保存至文件中

猜你喜欢

转载自blog.csdn.net/weixin_43551152/article/details/83550486
今日推荐