Shell脚本日常积累

1.shell脚本调试技巧

#1.Windows下编辑的脚本需要使用dos2unix格式化
dos2unix demo.sh

#2.使用bash命令参数调试
-n:不会执行该脚本,仅查询脚本语法是否有问题,并给出错误提示
-v:在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本,如果有错误,也会给出错误提示
-x:将执行的脚本内容及输出显示到屏幕上,这是对调试很有用的参数
export PS4='+${LINENO}'可以在每一行的前面加上内容的行号

#3.使用set命令进行部分脚本调试
set-n:读命令但并不执行。
set-v:显示读取的所有行。
set-x:显示所有命令及其参数。
1.通过set-x命令开启调试功能,而通过set+x关闭调试功能

2.Shell脚本自动化交互式

1.Here Document

格式

命令 << 分隔串(最为常见的为EOF)
字符串1
…
字符串n
分隔串

举例

root@localhost test]# cat test.sh
#! /bin/bash
read -p "enter number:" no
read -p "enter name:" name
echo you have entered $no, $name

#然后我们利用重定向来完成交互的自动化:
[root@localhost test]# ./test.sh <<EOF
>1
>lp
you have entered 1, lp

3.Shell的前后台

命令含义
fg( frontground) 前台执行Ctrl+z可以挂起前台运行的程序,用fg恢复到前台
bg(background) 后台执行在命令后面加上&它会在后台执行,并将特殊的环境变量$!设置为该任务的进程ID

4.vi命令(编辑模式)

12
显示行号set nu
跳转到指定的行行数gg
删除指定的行行数dd
删除所有内容ggdG
跳转到文本末尾G
跳转到当前行末尾A
撤销u
恢复上一步被撤销的ctrl+u
从上往下查/字符
从下往上查?字符

4.shell数组

# 数组的定义
array_name=(a b)
# 传递所有的数组值
函数名 ${array_name[@]}
# 查看所有数组的索引
${!array_name[@]}
# 查看
${#array_name[@]}

5.shell数值

# 数值的定义
i=0 #不要有空格
# 数值的计算
let i=i+1

6.字符串的分割

${parameter/parttern/string} 
用string来替换第一个匹配的pattern
${parameter//pattern/string} 
用string来替换parameter变量中所有匹配的pattern

string="hello,shell,split,test"  
array=(${string//,/ })  
 
for var in ${array[@]}
do
   echo $var
done 

7.sed命令

定义:行文件编辑工具,因为它编辑文件是以行为单位的

语法: sed -参数 '脚本命令' 文件名

参数:

参数名含义
-n取消静默输出
-i表示对文件进行编辑

common.ini

user_name=cs_name
jar = cs_jar
database_pwd = cs_pwd
redis_pwd = cs_pwd_redis
#默认输出common.ini所有的内容
sed  's/cs_pwd/123456/' common.ini
#只输出修改过的行
sed  -n 's/cs_pwd/123456/p' common.ini

动作:

以下动作在参数为-i时候才会生效

动作含义
a在匹配到的内容下一行增加内容
i在匹配到的内容当前行增加内容
d删除匹配到的内容
s替换匹配到的内容
p查看指定内容

7.1增

########################在指定的行号附近增加增加内容######################################
sed -i '行号1,行号2a/增加的内容' 文件名 #在指定的行号后面添加数据
sed -i '行号1,行号2i/增加的内容' 文件名 #在指定的行号前面添加数据
sed -i '$a增加内容' 文件名  #在最后一行的下面增加一行内容
sed -i '1i新增行的内容' 文件名 #在第一行上面增加一行内容


########################在匹配内容附近增加增加内容######################################

#在匹配到的内容的上一行增加内容
sed -i '/匹配到的内容/i 增加的内容' 文件名 
sed '/jar = cs_jar/i  jar =/home/json' common.ini

#在匹配到的内容的下一行增加内容
sed -i '/匹配到的内容/a 增加的内容' 文件名 
sed '/jar = cs_jar/a  jar =/home/json' common.ini

#在匹配到的内容的当前行增加内容,原有的内容被清空
sed -i '/匹配到的内容/c 增加的内容' 文件名 
sed '/jar = cs_jar/c  jar =/home/json' common.ini

注意

sed中的行号从1开始

7.2删

########################删除指定行号内容######################################
#删除指定行号的内容,删除指定范围内的行号
sed -i '行号1,行号2d' 文件名

########################删除匹配内容相关内容######################################
#删除匹配到的内容所在的行,匹配多行则删除多行
sed  -i '/匹配的内容/d' 文件名
#只删除匹配到内容
sed  -i 's/匹配的内容/空内容/' 文件名 #当一个行匹配了多个内容,默认替换第一个内容
sed  -i 's/匹配的内容/空内容/g' 文件名 #当一个行匹配了多个内容,替换所有内容
sed   

注意

2.多个操作之间用;进行分割,正则如何进行扩展使用,显示行号=

7.3改

########################替换指定行号的内容######################################
#指定行号,列号,默认替换首行内容,g代表替换所有内容
sed -i '行号s/原内容/替换后内容/列号' 文件名

########################替换匹配的内容######################################
#替换匹配的内容
sed -i 's/正则表达式/替换的内容/' 文件名 #替换每行首个匹配内容
sed -i -r 's/扩展正则表达式匹配到的内容/替换的内容' 文件名 #扩展正则 如*+?|

注意

关键字匹配时隔离符号/ 可以更换成@,#,!等符号,根据情况使用,如果关键字和隔离符号有冲突,就更换成其他的符号即可

7.4查

#-n选项会禁止sed,p标记会输出修改过的行,将二者匹配使用的效果就是只输出被替换命令修改过的行
sed -n '/匹配的内容/p' 文件名

8.awk命令

定义: awk是一个功能非常强大的文档编辑工具,它不仅能以行为单位还能以列为单位处理文件

语法:awk -参数 '命令' 文件名

参数:

参数含义
-F指定列的分隔符,在不指名-F域分隔符的情况下,默认的域分隔符是空格
-f调用脚本
-v定义变量

动作

动作作用
print显示内容
$0:显示当前行所有内容
n : 显 示 当 前 行 的 第 n 列 内 容 , 如 果 存 在 多 个 n:显示当前行的第n列内容,如果存在多个 n:n,n,它们之间使用逗号(,)隔开
BEGIN{ 命令 }     #初始代码块,主要和变量相关
/pattern/{ 命令 }  #pattern正则匹配、执行代码块
END{ 命令 }      #结束代码块,主要和信息输出相关

内置变量:

内置变量含义
FILENAME当前输入文件的文件名,该变量是只读的
NR指定显示行的行号
NF输出最后一列的内容
OFS输出格式的列分隔符,缺省是空格
FS输入文件的列分融符,缺省是连续的空格和Tab

举例

cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
syslog:x:996:994::/home/syslog:/bin/false
lighthouse:x:1000:1000::/home/lighthouse:/bin/bash
mongod:x:995:990:mongod:/var/lib/mongo:/bin/false
#例1
awk  -F ':'  '{print $1} /etc/passwd

#例2
awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}' /etc/passwd

#例3:搜索/etc/passwd有root关键字的所有行
awk -F: '/root/' /etc/passwd
awk -F: '/^root/'' /etc/passwd

#例4 统计某个文件夹下的文件占用的字节数
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
#以M为单位显示,注意,统计不包括文件夹的子目录
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'

# 统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹)
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ",size/1024/1024,"M"}'

9.linux命令自省

man

man sed # man是manual缩写

help

help cd # 内部命令  
sed --help # 外部命令
#shell(命令解释器)自带的命令称为内部命令,其他都是外部命令

info

info ls #info帮助比help更详细,作为help的补充

10.常用的linux命令

1.初始化项目权限: umask 007

2.查看xx.so文件属于那个库 yum whatprovides xxx.so

3.查看磁盘空间:df -h

4.查看系统版本:cat /etc/*release

5.shell中常见的字符串操作

12
-z检测字符串长度是否为0,为0返回 true。
-n检测字符串长度是否不为 0,不为 0 返回 true。

6.logger的用法

12
-i逐行记录每一次logger的进程ID
-t指定标记记录
#在/var/log/messages文件中记录为 lp[123456]:hello
logger -i -t lp "hello"

7.shell 脚本中$ , , ,#,$?分别代表什么意思?

12
$*这个程式的所有参数,此选项参数可超过9个。
$#这个程式的参数个数
$$这个程式的PID(脚本运行的当前进程ID号)
$@跟$*类似,但是可以当作数组用

8.shell脚本中字符串变量前加个x

#防止$var为空时报错
x"abcd" = x"$var"

9.read

12
-p给出提示符。默认不支持"\n"换行,要换行需要特殊处理
-r禁止反斜线的转义功能.这意味着"\"会变成文本的一部分
read -p -r "Do you want install?"

10.getopt的使用

11.diff命令

语法

diff [选项] old_file new_file
选项说明
-r递归比较各子目录下的文件
-N将不存在的文件当作空文件
-u默认输出每个修改前后的3行,也可以用-u5等指定输出更多上下文。
-B忽略对空行的比较
-w忽略所有空格和制表符。例如,if ( a == b ) 与 if(a==b) 相等。

举例

 diff -Nur src src_new >src.patch

12.patch打补丁

patch 指令让用户利用设置修补文件的方式,修改,更新原始文件

语法:

path -p剥离层级 < 补丁文件

patch命令用法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值