shell脚本-sed
shell脚本-sed
Linux处理文本文件的工具:
grep 过滤文件内容
sed 编辑文件内容
awk
正则表达式Regex
正则表达式Regex
匹配单个字符的元字符
.
[abc] [a-z] [A-Z] [0-9] [a-zA-Z0-9] [^a-z]
[[:alpha:]] [[:upper:]] [[:lower:]] [[:digit:]] [[:alnum:]] [[:space:]] [[:punct:]]
匹配字符出现的位置
^str str$ ^$
匹配字符出现的次数
- ? + {3} {2,5} {2,}
分组:(abc){2}
.*
sed: Stream Editor 流编辑器
行编辑器 逐行编辑
将每行内容读入到内存中,在内存中进行处理,将结果返回给屏幕 ,此段内存空间称为模式空间
默认不编辑原文件,仅对模式空间的数据进行处理,处理结束后,将模式空间的内容显示到屏幕
sed命令的使用格式
sed [option] scripts file1 file2 ...
sed [option] ‘AddressCommand‘ file1 file2 ...
Address:表示对哪些行进行处理 Command:操作命令 option选项: -n:不再显示模式空间中的内容(默认显示) -i: 直接修改原文件 -e ‘AddressCommand‘ -e ‘AddressCommand‘:同时执行多个匹配操作 [ ~]# sed -e ‘/^#/d‘ -e ‘/^$/d‘ /etc/fstab -f FILE 将多个AddressCommand保存至文件中,每行一个AddressCommand;读取该文件中的操作同时执行多个操作 [ ~]# cat /tmp/1.txt /^#/d /^$/d [ ~]# sed -f /tmp/1.txt /etc/fstab -r:表示使用扩展正则表达式 [ ~]# sed -r ‘s|l(..e)|L\1|‘ /tmp/1.txt --follow-symlinks 修改软链接文件时 [ ~]# sed --follow-symlinks -i ‘s|hello|hi|‘ /tmp/2.txt
Address表示方法:
1、StartLine,EndLine
1,100
1,$
3,10
2、LineNumber
3
3、StartLine,+n
5,+2 /root/,+2
4、/正则表达式/
/root/ /bash$/
5、 /正则表达式1/, /正则表达式2/
第1次被Regex1匹配的行开始,到第1次被Regex2匹配的行中间的所有行
Command:
d 删除符合条件的行
sed ‘1,2d‘ /etc/inittab
删除文件中包含oot的行
sed ‘/oot/d‘ /etc/fstab
删除第1行及其后2行
sed ‘1,+2d‘ /etc/fstab
删除第1行
sed ‘1d‘ /etc/fstab
删除以/开头的行
sed ‘/^//d‘ /etc/fstab
p 显示符合条件的行
显示以/开头的行
sed -n ‘/^//p‘ /etc/fstab
a \string 在符合条件的行后追加新行,string为追加的内容
在以/开头的行后面追加# hello world
sed ‘/^//a # hello world‘ /etc/fstab
在以/开头的行后面追加两行内容,分别为# hello worl # hello linux
sed ‘/^//a # hello world\n# hello linux‘ /etc/fstab
i \string 在符合条件的行前添加新行,string为追加的内容
在文件第1行添加# hello world
sed ‘1i # hello world‘ /etc/fstab
c \string 替换指定行的内容
将文件中最后一行内容替换为End Of File
sed ‘$c \End Of File‘ /1.txt
sed ‘7c \SELINUX=disabled‘ /etc/sysconfig/selinux
= 用于显示每一行的行号
显示/etc/passwd文件最后一行的行号
# sed -n ‘$=‘ /etc/passwd
49
r file_name 将指定文件的内容添加到符合条件的行的后面
在文件的第2行后追加/etc/issue文件的内容
sed ‘2r /etc/issue‘ /etc/fstab
w file_name 将符合条件的内容另存到指定文件中
将以UUID开头的行另存为到/1.txt中
sed ‘/^UUID/w /1.txt‘ /etc/fstab
s/regex/string/[修饰符] 查找并替换 默认情况下,只替换每一行第1次出现的字符
修饰符:
g:替换每一行所有的字符
i:忽略大小写
[ ~]# sed ‘s/^#/?/‘ /etc/fstab
查找文件中的UUID,并替换为uuid
sed ‘s/UUID/uuid/‘ /etc/fstab
将行首的/替换成#
sed ‘s/^//#/‘ /etc/fstab
[ ~]# sed ‘s|/|#|g‘ /etc/fstab
将每一行出现的所有/替换为@
sed ‘s///@/g‘ /etc/fstab
反向引用 () \1 \2
将文件中以l..e替换为l..er,例如love替换为lover
sed ‘s/(l..e)/\1r/g‘ /etc/fstab
或
sed ‘s/l..e/&r/g‘ /etc/fstab
&:引用正则表达式匹配的所有字符串
将文件中l..e的单词替换为L..e,例如love替换为Love
sed ‘s/l(..e)/L\1/‘ /1.txt
删除行首的空格
[ ~]# sed ‘s|^#||‘ /etc/fstab
[ ~]# history | sed ‘s|+||‘
sed示例:
1、删除/etc/grub2.cfg文件中行首的空白字符
2、将/etc/fstab文件中的数字5替换为数字3
3、删除/etc/fstab文件中的空白行
4、删除/etc/inittab文件中开头的#号
5、删除某文件中开头的#号,但要求#号后面必须有空白字符
6、删除某文件中以空白字符后面跟#号的行中的开头的空白字符及#
系统初始化脚本:
- 配置固定IP
- 关闭SEinux及防火墙
- yum源
- 关闭SSH DNS解析及GSSAPI认证
- 172.16.8.100同步时间
- 设置主机名
shell脚本中对字符串的处理
1、${#变量名}
作用:返回字符串的长度
foo="this is a test"
echo ${#foo} //返回字符串foo的长度
14
2、${变量名:offset:length}
作用:截取字符串,length指定截取的长度,也可以不写;字符串的第一个字符的索引值为0
foo="abcdefg"
echo ${foo:3:2} //从下标为3的字符开始截取,共截取2个
de
echo ${foo:3} //从下标为3的字符开始截取到最后的字符
defg
3、${变量名#pattern} ${变量名##parttern}
pattern:模式,通配符表达式
作用:清除字符串中符合pattern的字符
foo="file.txt.zip"
echo ${foo#*.} //一个#号代表按照最短匹配清除
txt.zip
echo ${foo##*.} //2个#号代表按照最长匹配清除
zip
4、${变量名%pattern} ${变量名%%parttern}
pattern:模式,通配符表达式
作用:清除字符串中符合pattern的字符,从字符串最后匹配
echo $foo
file.txt.zip
echo ${foo%.*} //1个%代表按照最短匹配
file.txt
echo ${foo%%.*} //2个%%代表按照最长匹配
file
5、字符串替换操作
${变量名称/old/new}
[ ~]# foo="mp3.txt.txt.mp3.avi"
[ ~]#
[ ~]# echo ${foo/txt/TXT}
mp3.TXT.txt.mp3.avi
[ ~]#
[ ~]# echo ${foo//txt/TXT}
mp3.TXT.TXT.mp3.avi
[ ~]# foo="txt.mp3.txt"
[ ~]#
[ ~]# echo ${foo/#txt/TXT}
TXT.mp3.txt
[ ~]# echo ${foo/%txt/TXT}
txt.mp3.TXT
6、实现大小写字母的转换
foo="ABde"
echo ${foo,,} //将字符串foo全部转换成小写
abde
echo ${foo,} //将字符串foo的第1个字符转换成小写
aBde
echo ${foo^} //将字符串foo的第1个字符转换成大写
ABde
echo ${foo^^} //将字符串foo全部转换为大写
ABDE
数组 Array
一段连续的内存空间
- 定义数组
[ shell]# aa[0]=martin
[ shell]# aa[1]=jerry
[ shell]# aa[2]=mike
[ shell]# aa[10]=alice
[ shell]# bb=(192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4)
- 调用数组的值
[ shell]# echo ${bb[2]}
192.168.1.3
[ shell]# echo ${bb[1]}
192.168.1.2
[ shell]# echo ${bb[*]}
192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4
[ shell]# echo ${bb[@]}
192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4
- 获取数组的长度
[ shell]# echo ${#bb[*]}
4
[ shell]# echo ${#bb[@]}
4
编写脚本,找出数组中的最大数
!/bin/bash
aa=(14 543 64 235 76 345 765)
max=${aa[0]}
for i in seq 6
; do
if [ $max -lt ${aa[$i]} ]; then
max=${aa[$i]}
fi
done
echo $max
处理交互式的命令 ------- expect
- 安装expect
yum install -y expect
示例1:捕获ssh远程连接命令的提示
!/usr/bin/expect
spawn ssh
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "uplooking\r" };
}
interact
示例2:捕获scp命令的提示
!/usr/bin/expect
set ip 192.168.122.121
spawn scp /etc/fstab $ip:/tmp
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "uplooking\r" };
}
expect eof
[:space:]