文章目录
tzk_shell三剑客(sed awk grep)
sed --》 sed [选项] [命令] [文件]
常用选项:
-n:只显示匹配处理的行
-i:直接在文件中进行修改
-r:对扩展正则的支持(基本正则中:^$\d这样的元字符很少)
常用命令:
p:打印匹配行print --》常和-n联用
d:删除指定行delete
a:在匹配行的下面一行追加append
i:在匹配行前面插入insert
c:整行替换
r:将文件的内容读入read
w:将文件写入文件write
s:字符串替换
N:将下一行一起读入模式空间作为一行\n分隔
sed -n ‘10,15p’ t1.txt
sed -n ‘1p;3p;5p’ t1.txt
# -r -w这两个比较拗口
sed -i '/luhaisen/r sed.txt' name.txt
#将sed.txt的内容导入到name.txt文件里的luhaisen行的后面
sed -i '1,5w sed.txt' name.txt
#将name.txt的1到5行的内容写入到sed.txt文件里,会覆盖里面的内容
sed的单引号和双引号
双引号里可以使用shell里的变量
单引号不行
单引号和双引号里都可以存放模式
[root@cali 5_23]# a=5
[root@cali 5_23]# b=10
[root@cali 5_23]# cat -n passwd |sed -n "${a}p;${b}p"
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@cali 5_23]#
[root@cali 5_23]# cat -n passwd |sed -n '${a}p;${b}p'
sed: -e expression #1, char 0: unmatched `{'
[root@cali 5_23]#
sed查找方式
-
行号查找 :sed -n ‘/bash/p’ /etc/passwd
-
模式查找 :
sed -n -r '/.* ***tzk.****bash/p' /etc/passwd sed -nr '/^[^0-9]/p' /etc/passwd 已不是数字开头的 ,逗号是连接符、:取两个模式之间的数据用,逗号隔开 !感叹号是取反符
sed中的三种替换标记:g/p/w
- sed -n [行号或模式]s/查找内容/替换内容/[替换标记] 文件
数字:替换每行的第几个
g:全局替换,否则只替换一行中第一个字符串。例如ng从第n个开始替换
p:显示被执行替换操作的行和-n合用
w:将执行替换操作的行输出到指定文件
#### sed中的s命令
将文件中每行的第2个root替换为ROOT
```shell
sed -n 's/root/ROOT/2p' /etc/passwd
将文件中找到以id开头的行中的:3:替换成:5:
sed '/^id/s/:3:/:5:/' /etc/inittab
禁止本地用户登陆
sed '/^local_enable/s/YES/NO/' vsftpd.conf
将文件中的:号替换为换行符
sed 's/:/\n/g' /etc/passwd
将文件中bash替换成nologin,同时将sbin替换成bin
sed 's/bash/nologin/;s/sbin/bin/' /etc/passwd
在前面加元素,和后面加元素
sed -n '2,10s/^/#/p' passwd
#在2到10行前面加上注释
sed -n 's/$/?/p' passwd
#在每行末尾加上?
sed取奇数行(12)、偶数行(22)
[root@nginx-bianyi lianxi]# cat passwd -n|sed -n '1~2p'
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
13 nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
15 systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
17 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
19 unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
21 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@nginx-bianyi lianxi]# cat passwd -n|sed -n '2~2p'
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
8 halt:x:7:0:halt:/sbin:/sbin/halt
10 operator:x:11:0:operator:/root:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
14 dbus:x:81:81:System message bus:/:/sbin/nologin
16 systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
18 polkitd:x:998:996:User for polkitd:/:/sbin/nologin
20 sssd:x:996:993:User for sssd:/:/sbin/nologin
22 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
小练习:
#1.在每行前面加一个字符串
#2.一个文件
# 0.0.0.0
# 1.1.1.1
# 2.2.2.2
# 输出以下形式:
# 0.0.0.0:80,1.1.1.1:80,2.2.2.2:80
# 答:
sed -i 's/$/:80/;N;N;s/\n/,/' t1.sh
# 把passwd文件前的数字和空格全部去掉
cat -n passwd |sed -nr 's/\s+[0-9]+\s+//p'
sed高级用法
模式空间(pattern space)、缓存空间(hold space)
标签的用法
1、将passwd中的uid后面加个0,gid前面加个1
cat passwd |sed -nr '/^root/!s/([0-9]+):([0-9]+)/\10:1\2/p'
2、将文件里的a.txt里的内容
1
2
3
4
5
修改为 sc:5 sc:4 sc:3 sc:2 sc:1
sed -i -r 'N;N;N;N;s/\n/ /g;s/([0-9])+\s([0-9])+\s([0-9])+\s([0-9])+\s([0-9])+/sc:\5 sc:\4 sc:\3 sc:\2 sc:\1/' a.txt
sed中正则灵活使用
将有邮箱的列把邮箱和后面的名字交换
[root@sanchuang-sed lianxi]# cat test.txt
0.0.0.0
1.1.1.1
2.2.2.2
https://www.baidu.com/map/feng.htm
https://www.qq.com/sanchuang/tan.html
https://www.163.com/lihu/li.htm
tan123@sc.com tanzikun
feng_dy@sina.com cali
ran123@163.com ran
cali@facebook.cn califeng
[root@sanchuang-sed lianxi]# cat test.txt|sed -n 's/(\w+@\w+\.[a-Z]+)(.*)/\2 \1/p'
tanzikun tan123@sc.com
cali feng_dy@sina.com
ran ran123@163.com
califeng cali@facebook.cn
在这里,其实使用awk更加便利
–》》》awk的使用
[root@sanchuang-sed lianxi]# cat test.txt|awk '/@/{print $2,$1}'
tanzikun tan123@sc.com
cali feng_dy@sina.com
ran ran123@163.com
califeng cali@facebook.cn