grep 就是查找文本当中的内容,扩展正则表达式
sed是一种流编辑器,一次处理一行内容
如果只是展示,会放在缓冲区(模式空间),展示结束之后,会从模式空间把操作结果删除。
一行一行处理,处理完当前行,才会处理下一行。直到文件末尾。
sed的主要作用就是对文本的内容进行增删改查,其中最好用,最强大的是改和增
sed的命令格式
sed -e '操作符' -e ‘操作符’ 文件1 文件2
-e表示可以跟多个操作符,只有一个操作,-e可以省略
sed -e '操作符1;操作符2' 文件1 文件2
操作选项
sed -e 用于执行多个操作命令
sed -f 在脚本中定义好操作符,然后根据脚本内容的操作符对文件进行操作
sed -i 直接修改目标文件(慎用)
sed -n 仅显示scrip处理后的结果(不加-n,sed会有两个输出结果;加了-n 之后会把默认输出屏蔽,只显示一个结果)
操作符
p:打印结果
r:使用扩展正则表达式
s:替换,替换字符串
c:替换。替换行
y:替换,替换单个字符,多个字符替换必须和替换内容的字符长度保持一致
d:删除,删除行
a:增加,在指定行的下面一行插入内容
i:增加,在指定行的上面一行插入内容
打印功能:
sed -n 'p'
寻址打印 sed -n '=;p' 打印所有的行
sed -n '4p' 打印指定的行
sed -n '$p' 打印最后一行
sed -n '2,$p' 打印行号范围 打印第二行到最后一行
sed -n '2p;$p' 打印第2行和最后一行
sed -n 'p;n' 打印奇数行
sed -n 'n;p' 打印偶数行
文本内容进行过滤 sed -n '/o/p' test.txt 过滤并打印包含o 的行
使用正则表达式对文本内容进行过滤
sed -n '/^root/p' /etc/passwd 查找passwd以root开头的行
从指定行开始,打印到第一个以bash结尾的行
sed -n '3,/bash$/p' /etc/passwd
扩展正则 :sed -rn
sed -rn '/(99:){2,}p' /etc/passwd 查找passwd有2个99的行
要么以root为开头,要么以bash为结尾的行 sed -rn '/^root|bash$/p' /etc/passwd
面试题:
如何免交互删除文本内容,不删除文件
1.sed -i 'd' 文件名
2.cat /dev/null > test1.txt
sed的删除操作
sed -n '3d;p' 删除指定的第三行并打印剩余的行
sed -n '5,$d;p' 删除第五行到最后一行并打印剩余的行
sed -n '1!d;p' 取反,除了第一行其他的都删除
sed -n '4,6!d;p'除了第四行到第六行其他的都删除
sed -n '4p;6!d;p' 111.txt 除了第四行和第六行,其他的都删除
sed -n '/o/p' 删除o的行并打印其他行
sed -n '/o/!d' 除了o的其他都删除
免交互删除空行的三种方式:
grep -v "^$" test.txt
cat tets.txt | tr -s "\n"
sed '/^$/d' test.txt
sed的替换
替换字符串
sed -n 's/root/test/2p' /etc/passwd 把第二个root替换成test
sed -n 's/root/test/gp' /etc/passwd 把所有的root替换成test
sed -n 's/^/#/p' 把所有行都注释
sed -n '4,6s/^/#/p' 111.txt 把第四行到第六行注释
sed -n '4s/^/#/p;6s/^/#/p' 111.txt 把第四行和第六行注释
字母大小写转换 (u&小写变成大写 l&大写变成小写)
sed 's/[a-z]/\u&/' test.txt (首字母小写变成大写)
sed 's/[a-z]/\u&/g' test.txt (所有字母都变成大写)
sed 's/[A-Z]/\l&/' 111.txt (把首字母大写变成小写)
sed 's/[A-Z]/\l&/g' 111.txt (所有字母都变成小写)
整行替换
sed '/11/c wo zhen de shuai' test.txt 把11正好替换
面试题:免交互替换ip地址
sed '/IPADDR=192.168.233.10/c IPADDR=192.168.233.100' /etc/sysconfig/network-scripts/ifcfg-ens33
sed 'y/one/111/' test.txt 把包含one的都替换成111 对应变
sed 增加
sed '/three/a lll ' test.txt 行下插入新的内容
sed '/three/i lll' test.txt 行上插入新的内容
sed 'three/r test1.txt' test.txt 读取其他文件的内容,在第三行下面插入
sed '$a kuku' test.txt 在最后一行插入新的内容
sed '$i kuku' test.txt 在倒数第二行插入新的内容
sed '$r test1.txt' test.txt 读取其他文件的内容,然后插入到对象文件的最后一行
使用sed对字符串和字符的位置进行互换
sed -r 's/(ge)(fang)(wen)/\3\1\2/'
echo 真的帅 | sed -r 's/(.)(.)(.)/\3\2\1/'
sed -f 123.txt 456.txt 脚本内容替换
面试题 免交互提取数字
grep -E '"[0-9]+\." test.txt
cat 123.txt | sed -r 's/(.*)-(.*)(\.jar)/\2/'
打印指定时间日志
sed -n '/Jun 21 09:12:14,/Jun 21 12:00:01/p’ /var/log/messages