# 打印test.txt文件的第17行 sed -n "17p" test.txt # 打印文件的10到20行 sed -n "10,20p" test.txt # 打印test.txt文件中从第10行开始,往后面加5行 sed -n "10,+5p" test.txt # 打印test.txt文件中以root开头的行 sed -n "/^root/p" test.txt # 打印test.txt文件中第一个匹配到以ftp开头的行,到mail开头的行结束 sed -n "/^ftp/,/^mail/p" test.txt # 打印test.txt文件中从第4行开始匹配,直到以hdfs开头的行结束 sed -n "4,/^hdfs/p" test.txt # 打印test.txt文件中匹配root的行,直到第10行结束 sed -n "/root/,10p"test.txt
2.2.3 sed中的编辑命令
编辑命令
类别
含义
p
查询
打印
=
查询
只显示行号
a
增加
行后追加
i
增加
行前追加
r
增加
外部文件读入,行后追加
w
增加
匹配行写入外部文件
d
删除
删除
s/old/new
修改
将行内第一个old替换为new
s/old/new/g
修改
将行内全部的old替换为new
s/old/new/2g
修改
将行内从第2个old开始到剩下所有的old替换为new
s/old/new/ig
修改
将行内全部的old替换为new,忽略大小写
反向引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[cmuser@localhost test]$ cat abc.txt First Line Second haha [cmuser@localhost test]$ sed -i 's/Sec..d/&s/g' abc.txt [cmuser@localhost test]$ cat abc.txt First Line Seconds haha [cmuser@localhost test]$ sed -i 's/\(Sec..ds\)/\10/g' abc.txt [cmuser@localhost test]$ cat abc.txt First Line Seconds0 haha [cmuser@localhost test]$ sed -i 's/\(Sec\)...../\1FFFFFFFFFF/g' abc.txt [cmuser@localhost test]$ cat abc.txt First Line SecFFFFFFFFFF haha
&和\1引用模式匹配到的整个串
两者区别在于只能表示匹配到的完整字符串,只能引用整个字符串;而\1可以使用()匹配到的字符
sed中引用变量时注意事项:
匹配模式中存在变量,则建议使用双引号
sed中需要引入自定义变量时,如果外面使用单引号,则自定义变量也必须使用单引号
1 2 3 4 5 6
[cmuser@localhost test]$ old_str=First [cmuser@localhost test]$ new_str=One [cmuser@localhost test]$ sed -i "s/$old_str"/"$new_str/g" abc.txt [cmuser@localhost test]$ cat abc.txt One Line SecFFFFFFFFFF haha
# a:在匹配行后面追加 # (1)、passwd文件第10行后面追加"Add Line Behind" sed -i '10a Add Line Begind' passwd # (2)、passwd文件第10行到第20行,每一行后面都追加"Test Line Behind" sed -i '10,20a Test Line Behind' passwd # (3)、passwd文件匹配到/bin/bash的行后面追加"Insert Line For /bin/bash Behind" sed -i '/\/bin\/bash/a Insert Line For /bin/bash Behind' passwd # i:在匹配行前面追加 # (1)、passwd文件匹配到以yarn开头的行,在匹配行前面追加"Add Line Before" sed -i '/^yarn/i Add Line Before' passwd # (2)、passwd文件每一行前面都追加"Insert Line Before Every Line" sed -i 'i Insert Line Before Every Line' passwd # r:将文件内容追加到匹配行后面 # (1)、将/etc/fstab文件的内容追加到passwd文件的第20行后面 sed -i '20r /etc/fstab' passwd # (2)、将/etc/inittab文件内容追加到passwd文件匹配/bin/bash行的后面 sed -i '/\/bin\/bash/r /etc/inittab' passwd # (3)、将/etc/vconsole.conf文件内容追加到passwd文件中特定行后面,匹配以ftp开头的行,到第18行的所有行 sed -i '//,18r /etc/vconsole.conf' passwd # w:将匹配行写入指定文件 # (1)、将passwd文件匹配到/bin/bash的行追加到/tmp/sed.txt文件中 sed -i '/\/bin\/bash/w /tmp/sed.txt' passwd # (2)、将passwd文件从第10行开始,到匹配到hdfs开头的所有行内容追加到/tmp/sed-1.txt sed -i '10,/^hdfs/w /tmp/sed-1.txt' passwd
2.3 文件处理三剑客之awk
awk是一个文本处理工具,通常用于处理数据并生成结果报告
1 2
awk 'BEGIN{} pattern{commands}END{}' file_name standard output | awk 'BEGIN{}pattern{commands}END{}'
语法格式
解析
BEGIN{}
正式处理数据之前执行
pattern
匹配模式
{commands}
处理命令,可能多行
END{}
处理完所有匹配数据后执行
2.3.1 awk内置变量
内置变量
解析
$0
打印行所有信息
$1~$n
打印行的第1到n个字段的信息
NF
Number Field 处理行的字段个数
NR
Number Row 处理行的行号,从1开始计数
FNR
File Number Row 多文件处理时,每个文件单独记录行号,都是从0康凯斯
FS
Field Separator 字段分割符,不指定时默认以空格或tab键分割
RS
Row Separator 行分隔符,不指定时以回车分割\n
OFS
Output Filed Separator 输出字段分隔符。
ORS
Output Row Separator 输出行分隔符
FILENAME
处理文件的文件名
ARGC
命令行参数个数
ARGV
命令行参数数组
1 2 3 4 5 6 7 8 9
[cmuser@localhost test]$ awk '{print $0}' abc.txt One Line SecFFFFFFFFFF haha [cmuser@localhost test]$ awk '{print $1}' abc.txt One SecFFFFFFFFFF [cmuser@localhost test]$ awk '{print NR}' abc.txt 1 2