1.sed命令语法
1. sed基本语法:
sed [options] {sed-commands} {input-file}
sed是每次从input-file中读取一行记录,并在该记录上执行sed-commands,首先从input-file中读取第一行,然后执行所有的sed-commands;再读取第二行,执行所有sed-commans,重复这个过程,直到该文件结束。
例如:打印出/etc/passwd文件中的所有行
sed -n 'p' /etc/passwd
2.sed脚本基本语法:
sed [options] -f {sed-commands-in a file} {input-file}
例如:打印/etc/passwd 中以root和nobody开头的行:
先将脚本保存在文档中
$ vi test-script.sed
/^root/ p
/^nobody/ p
再
sed -n -f test-script.sed /etc/passwd
3.sed多项命令执行:
使用-e选项,执行多个sed命令
sed [options] -e {sed-command} -e {sed-command2} {inputfile}
例如:打印/etc/passwd中以root和nobody开头的行:
sed –n –e ‘/^root/ p’ –e ‘/^nobody/ p’ /etc/passwd
也可以使用\把它们分隔到多行执行:
# sed -n \
> -e '/^root/ p' \
> -e '/^nobody/ p' \
> /etc/passwd
root:x:0:0:root:/root:/bin/bash
nobody:x:99:99:Nobody:/:/sbin/nologin
还可以使用 {}将多个命令分组执行:
sed [options] '{
sed-command1
sed-command2
}' inputfile
例如:
# sed -n '{
> /^root/p
> /^nobody/p
> }' /etc/passwd
root:x:0:0:root:/root:/bin/bash
nobody:x:99:99:Nobody:/:/sbin/nologin
注意:sed不会修改原始文件,它只是将结果内容输出到标准输出设备。
2.sed脚本执行流程
顺序:read-execute-print-repeat(读取-执行-打印-重复),简称REPR
读取一行到模式空间(sed内部的一个临时缓存,存放读取到的内容)
再在模式空间中执行命令。若使用了多个命令({}、-e等),则依次执行
重复以上过程,直到文件读取结束
3.打印模式空间(p)
使用p命令,可以打印当前模式空间的内容。
sed在执行完成后会默认打印模式空间的内容,那为何还要使用p呢?
命令p可以控制只输出你指定的内容。通常使用p时,还需要使用-n来屏蔽sed的默认输出,否则当执行命令p时,每行记录会输出两次。
例如:打印1234.txt
# sed 'p' 1234.txt
1 2 3 6 9 78 44
1 2 3 6 9 78 44
55 44 9 6 3 7 4
55 44 9 6 3 7 4
# sed -n 'p' 1234.txt
1 2 3 6 9 78 44
55 44 9 6 3 7 4
1.指定地址范围
1.只打印第二行:
# sed -n '2 p' employee.txt
102,Jason Smith,IT Manager
2.打印第一行至第四行:
# sed -n '1,4 p' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
3.打印第二行至第最后行:
# sed -n '2,$ p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
2.修改地址范围
逗号:n,m表示第n行至第m行;
+号:n,+m表示从第n行开始后的m行
~号:指定每次要跳过的行数。n~m表示从第n行开始,每次跳过m行:
1~2:匹配1,3,5,7......
2~2:匹配2,4,6,8......
只打印计数行:
# sed -n '1~2 p' employee.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
105,Jane Miller,Sales Manager
3.模式匹配
使用数字指定地址(或地址范围),也可以使用一个模式(或模式范围)来匹配。
1.打印匹配模式“Jane”的行:
# sed -n '/Jane/p' employee.txt
105,Jane Miller,Sales Manager
2.打印第一次匹配Jason的行至第四行的内容:
# sed -n '/Jason/,4p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
如果开始的四行中没有匹配到Jason,那么会打印第四行以后匹配到Jason的内容
3.打印自匹配到Raj的行开始到匹配Jane的行之间的所有内容:
# sed -n '/Raj/,/Jane/p' employee.txt
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
4.打印匹配Jason的行和其后面的两行
# sed -n '/Jane/,+2 p' employee.txt
4.删除行
d用来删除行,它只删除模式空间的内容,不会修改原始内容。
一般删除配合地址范围更有用:
1.只删除第二行:
# sed '2d' employee.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
2.删除第一行至第四行:
# sed '1,4d' employee.txt
105,Jane Miller,Sales Manager
3.删除奇数行:
# sed '1~2d' employee.txt
102,Jason Smith,IT Manager
104,Anand Ram,Developer
4.删除匹配Manager的行:
# sed '/Manager/ d' employee.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
5.删除所有空行:
# sed '/^$/ d' employee.txt
4.将模式空间内容写入到文件
w命令可以把当前模式空间的内容保存到文件中。一般执行命令后会输出到屏幕,如不输出用上-n。
把employee.txt内容保存到文件ems.txt,显示在屏幕上:
# sed 'w ems.txt' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manag
保存1-4行:
# sed '1,4 w ems.txt' employee.txt
保存匹配到Raj的行至最后一行:
# sed -n '/Raj/,$ w ems.txt' employee.txt