文本三剑客其二
sed和awk
grep就是查找文本当中的内容,扩展正则表达式。
sed 对文本内容进行增删改查
sed是一种流编辑器,一次处理一行内容。
如果只是展示,会放在缓冲区(模式空间),展示结束之后,会从模式空间把操作结果删除。
一行一行处理,处理完当前行,才会处理下一行。直到文件末尾。
sed的命令格式和操作选项:
sed -e '操作符' -e '操作符' 文件1 文件2
-e 表示可以跟多个操作符,只要有一个操作,-e可以省略。
sed -e '操作符1;操作符2' 文件1 文件2
选项:
-e:用于执行多个操作命令
-f:在脚本中定义好了操作符,然后根据脚本内容的操作符对文件进行操作
-i:直接修改目标文件(慎用)
-n:仅显示script处理后的结果(不加-n,sed会有两个输出结果,加了-n之后就会把默认输出屏蔽,只显示一个结果)
-r:扩展正则表达式
操作符:
p:打印结果
s:替换,替换字符串
c:替换,替换指定行
y:替换,替换单个字符,多个字符替换必须和替换内容的字符长度保持一致。
d:删除,删除行
a:增加,在指定行的下面一行插入内容
i:增加,在指定行的上面一行插入指定内容
=:标出行号
r:在行后增加文本内容
$a 在最后一行插入新的内容
$i 在最后一行上一行插入新的内容
$r 读取其他文件的内容,然后插入到对象文件的最后一行。
打印功能:
寻址打印
[root@localhost opt]# sed -n '=;p' test1.txt 1 13770325194 2 13131301010 3 111111111111
打印最后一行
[root@localhost opt]# cat -n test1.txt | sed -n '$p' 9 root1rootroot
行号范围打印:
打印第二行到第六行
[root@localhost opt]# cat -n test1.txt | sed -n '2,6p' 2 13131301010 3 111111111111 4 5 6 aaacvvaada
打印第二行和最后一行
[root@localhost opt]# cat -n test1.txt | sed -n '2p;$p' 2 13131301010 9 root1rootroot
打印奇数行
[root@localhost opt]# cat -n test1.txt | sed -n 'p;n' #n的作用打印一行,跳过下一行 1 13770325194 3 111111111111 5 7 root-root 9 root1rootroot
打印偶数行
[root@localhost opt]# cat -n test1.txt | sed -n 'n;p' #n的作用是跳过一行,打印下一行 2 13131301010 4 6 aaacvvaada 8 root
如何对文本内容进行过滤
[root@localhost opt]# cat -n test1.txt | sed -n '/o/p' #过滤并打印包含o的行 //之间是包含的要过滤的内容 7 root-root 8 root 9 root1rootroot
使用正则表达式对文本内容进行过滤
[root@localhost opt]# sed -n '/^root/p' /etc/passwd #以root为开头 root:x:0:0:root:/root:/bin/bash [root@localhost opt]# sed -n '/bash$/p' /etc/passwd #以bash为结尾 root:x:0:0:root:/root:/bin/bash zhang:x:1000:1000:zhang:/home/zhang:/bin/bash dn:x:1001:1001::/home/dn:/bin/bash xy102:x:1002:1002::/home/xy102:/bin/bash
从指定行开始,打印到第一个bash为结尾的行
[root@localhost opt]# sed -n '42,/bash$/p' /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin zhang:x:1000:1000:zhang:/home/zhang:/bin/bash
面试题1
如何免交互删除文本内容。不删除文件。
[root@localhost opt]# sed -i 'd' test2.txt [root@localhost opt]# cat test2.txt
或者
[root@localhost opt]# cat /dev/null > test2.txt [root@localhost opt]# cat test2.txt
sed 的删除操作
[root@localhost opt]# sed -in '1,3d;p' test2.txt 4 5 6 7 8
匹配字符串删除行
[root@localhost opt]# sed -n '/1/,/5/d;p' test2.txt 6 7 8
面试题2:
如何免交换的方式删除空行
sed的方式
[root@localhost opt]# sed '/^$/d' test1.txt 13770325194 13131301010 111111111111 aaacvvaada root-root root root1rootroot
grep
[root@localhost opt]# grep -v "^$" test1.txt 13770325194 13131301010 111111111111 aaacvvaada root-root root root1rootroot
cat
[root@localhost opt]# cat test1.txt | tr -s "\n" 13770325194 13131301010 111111111111 aaacvvaada root-root root root1rootroot
sed的替换
s替换字符串:
[root@localhost opt]# sed -n 's/root/test/gp' /etc/passwd #g是替换所有,g换成数字几就替换每行第几个 test:x:0:0:test:/test:/bin/bash operator:x:11:0:operator:/test:/sbin/nologin
[root@localhost opt]# sed -n '4,6 s/^/#/p' test1.txt #注释4-6行 [root@localhost opt]# sed -n -e '4s/^/#/p' -e '6s/^/#/p' test1.txt #注释4和6行
首字母变成大写
[root@localhost opt]# sed 's/[a-z]/\u&/' test1.txt 13770325194 13131301010 111111111111 Aaacvvaada Root-root Root Root1rootroot #u& 是转换首字母大写的特殊符号,\转义符
将单词的字母全部变为大写
[root@localhost opt]# sed 's/[a-z]/\u&/g' test1.txt 13770325194 13131301010 111111111111 AAACVVAADA ROOT-ROOT ROOT ROOT1ROOTROOT
将大写转换为小写
[root@localhost opt]# sed 's/[A-Z]/\l&/' test3.txt aAA bBB cCC dDD #l&把大写转换成小写的特殊字符,\转义符
[root@localhost opt]# sed 's/[A-Z]/\l&/g' test3.txt aaa bbb ccc ddd #g是将单词的所有字母大写转换为小写
c 整行替换
[root@localhost opt]# sed '/IPADDR=192.168.60.20/c IPADDR=192.168.60.100' /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet DEVICE=ens33 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.60.100 NETMASK=255.255.255.0 GATEWAY=192.168.60.2 DNS1=218.2.135.1 DNS2=221.131.143.69
y 单个字符替换
[root@localhost opt]# sed 'y/abc/123/' test3.txt AAA BBB CCC DDD 123
增加
a 在指定行下插入
[root@localhost opt]# sed '/AAA/a zhang' test3.txt AAA zhang BBB CCC DDD abc ABD
i 在指定行上一行插入新的内容
[root@localhost opt]# sed '/AAA/i zhang' test3.txt zhang AAA BBB CCC DDD abc ABD
r:在行后增加文本内容
[root@localhost opt]# sed '/BBB/r test4.txt' test3.txt AAA BBB zxc CCC DDD abc ABD
$a 在最后一行插入新的内容
[root@localhost opt]# sed '$a shuai dn' test3.txt AAA BBB CCC DDD abc ABD shuai dn
$i 在最后一行上一行插入新的内容
[root@localhost opt]# sed '$i shuai dn' test3.txt AAA BBB CCC DDD abc shuai dn ABD
$r 读取其他文件的内容,然后插入到对象文件的最后一行。
[root@localhost opt]# sed '$r test4.txt' test3.txt AAA BBB CCC DDD abc ABD zxc
使用sed命令对字符串和字符的位置进行互换
[root@localhost opt]# echo chengqianshuai | sed -r 's/(cheng)(qian)(shuai)/\3\1\2/' shuaichengqian [root@localhost opt]# echo 成乾真的帅 | sed -r 's/(.)(.)(.)(.)(.)/\5\4\3\2\1/' 帅的真乾成
面试题3:
ant-1.9.7.jar ant-launcher-1.9.7.jar antlr-2.7.7.jar antlr-runtime-3.4.jar aopalliance-1.0.jar archaius-core-0.7.6.jar asm-5.0.4.jar aspectjweaver-1.9.5.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15-1.46.jar bcprov-jdk15on-1.64.jar checker-compat-qual-2.5.5.jar
将版本号显示出来
grep
[root@localhost opt]# cat -n 456.txt | grep -E "\b[0-9][.][0-9][.][0-9]\b|\b[0-9][.][0-9]+\b"
sed
[root@localhost opt]# cat 456.txt | sed -r 's/(.*)-(.*)(\.jar)/\2/' 1.9.7 1.9.7 2.7.7 3.4 1.0 0.7.6 5.0.4 1.9.5 1.64 1.46 1.64 2.5.5
面试题4
打印指定时间内的日志
[root@localhost opt]# cat /var/log/messages | sed -r -n '/Jun 21 12:00:01/,/Jun 21 13:00:01/p' Jun 21 12:00:01 localhost systemd: Created slice User Slice of root. Jun 21 12:00:02 localhost systemd: Started Session 255 of user root. Jun 21 12:00:02 localhost systemd: Removed slice User Slice of root. Jun 21 12:01:01 localhost systemd: Created slice User Slice of root. Jun 21 12:01:01 localhost systemd: Started Session 256 of user root. Jun 21 12:01:01 localhost systemd: Removed slice User Slice of root. Jun 21 12:10:01 localhost systemd: Created slice User Slice of root. Jun 21 12:10:01 localhost systemd: Started Session 257 of user root. Jun 21 12:10:01 localhost systemd: Removed slice User Slice of root. Jun 21 12:20:01 localhost systemd: Created slice User Slice of root. Jun 21 12:20:01 localhost systemd: Started Session 258 of user root. Jun 21 12:20:01 localhost systemd: Removed slice User Slice of root. Jun 21 12:30:01 localhost systemd: Created slice User Slice of root. Jun 21 12:30:01 localhost systemd: Started Session 259 of user root. Jun 21 12:30:01 localhost systemd: Removed slice User Slice of root. Jun 21 12:40:01 localhost systemd: Created slice User Slice of root. Jun 21 12:40:01 localhost systemd: Started Session 260 of user root. Jun 21 12:40:01 localhost systemd: Removed slice User Slice of root. Jun 21 12:50:01 localhost systemd: Created slice User Slice of root. Jun 21 12:50:01 localhost systemd: Started Session 261 of user root. Jun 21 12:50:01 localhost systemd: Removed slice User Slice of root. Jun 21 13:00:01 localhost systemd: Created slice User Slice of root.