Linux三剑客之sed(一)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值