文本处理三贱客之—sed

三贱客之sed 1,grep:文本搜索工具 grep家族有三款工具:egrep,fgrep sed:全程stream editor,sed是流编辑器 sed和其他一样,只是把文本提取到内存中来进行编辑 awk(gawk):文本格式化工具,也可以称作文本报告生成器 以上三者在功能有重叠的地方,但是他们还是有各自的特色 sed命令: 在sed命令介绍之前,先看看正则表达式元字符: 字符匹配:., 任意单个字符,[]指定范围内单个字符,[^]指定范围外单个字符 次数指定:*前面字符任意次,\?零次或多次,\+一 次或多次 ,\{m,n}匹配指定次数,\{n\}精确匹配n此 位置锚定:^行首,$行尾,\<单词首部,\>单词尾部 分组和引用:\()分组,\1,\2,...引用 或者,多选一:a|b|c 再来扯一扯vim编辑器中的查找替换用法: s:用法格式,首先要地址定界s/查找范围,要查找的内容/替换为的内容 要查找的内容:可使用正则表达式 替换为的内容:不支持正则表达式,但支持使用引用前面正则表达式分组中的内容 地址定界:%全文查找,startline,endline,起始结束 也可以这样写/pat1/,/pat2/ 先看下sed语法格式 sed [OPTION]... {script-only-if-no-other-script} [input-file].. 选项 -r:支持扩展正则表达式元字符,不加-r就是基本表达式 -n:静默模式 -e:script -e script2 -e 。。。:指定多脚本运行 -f:/path/to/script_file:从指定文件中读取脚本并运行 -i:直接编辑源文件 地址定界: #: 指定行; $: 最后一行; /regexp/:任何能够被regexp所匹配到的行; \%regexp%:同上,只不过换作%为regexp边界符; /regexp/| : \%regexp%| :匹配时忽略字符大小写; startline,endline: #,/regexp/:从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行; #,# /regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束,中间的所有行; #,+n:从#行开始,一直到向下的n行; first~step:指定起始行,以及步长; sed概念: 当启动sed命令后,它会在内容中找一段空间,这段空间是处理sed“输入输出”的的空间,我们可以称他为“工作空间”,它会从源文件中逐行读取到sed的工作空间,(如果没有定界)读取一行内容,而后将结果打印至屏幕,而这个时候sed的这段内存空间叫做sed模式空间 sed基本工作机制: 每次读取一行文件至“模式空间(pattern space)”中,在模式空间中完成处理,不修改源文件,将处理结果输出至标准输出设备 sed编辑命令: d:删除模式空间中的行 示例:删除/etc/fstab第一行和第二行 [root@node1 clean-simple-white]# sed '1,2d' /etc/fstab # /etc/fstab # Created by anaconda on Sat Apr 4 08:45:23 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=4fb479dc-0364-41ac-a12d-841210d879a4 / ext4 defaults 1 1 UUID=30d2724b-a9be-4e32-8b9a-cf731a92173a /boot ext4 defaults 1 2 UUID=7568de25-a229-43cb-952a-ca5fd83bbdcc swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 如果加上-n 那就静默模式你是看不到结果的,并且cat也是看不到结果的 sed -n '1,2d' /etc/fstab -i -i如果和-n是不能一起使用的 复制一个fstab [root@node1 clean-simple-white]# cp /etc/fstab /tmp/ 修改源文件 [root@node1 clean-simple-white]# sed -i '1,3d' /tmp/fstab 在查看 [root@node1 clean-simple-white]# cat /tmp/fstab # Created by anaconda on Sat Apr 4 08:45:23 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) 地址定界: #:指定行 $:最后一行‘ /regexp/:任何能够被regexp所匹配到的行 \%regexp%:同上,只不过换做%为regexp边界符; /regexp/|:匹配时忽略字符大小写:\ startlone,endline: #,/regexp/:这表示从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行 #,#:某行开始某行结束 /regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束, #,+n:从#行开始,一直到向下的n行: first~step:指定起始行,以及步长: # 示例: 删除所有以#开头的行 [root@node1 clean-simple-white]# sed '/#/d' /tmp/fstab UUID=4fb479dc-0364-41ac-a12d-841210d879a4 / ext4 defaults 1 1 UUID=30d2724b-a9be-4e32-8b9a-cf731a92173a /boot ext4 defaults 1 2 UUID=7568de25-a229-43cb-952a-ca5fd83bbdcc swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 [root@node1 clean-simple-white]# =:打印行号 [root@node1 clean-simple-white]# sed '=' /tmp/fstab 1 # Created by anaconda on Sat Apr 4 08:45:23 2015 2 # 3 # Accessible filesystems, by reference, are maintained under '/dev/disk' 4 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 5 # 6 UUID=4fb479dc-0364-41ac-a12d-841210d879a4 / ext4 defaults 1 1 7 UUID=30d2724b-a9be-4e32-8b9a-cf731a92173a /boot ext4 default '/^#/=' 只打印#开头的行 [root@node1 clean-simple-white]# sed '=' /tmp/fstab 1 # Created by anaconda on Sat Apr 4 08:45:23 2015 2 # 3 # Accessible filesystems, by reference, are maintained under '/dev/disk' 4 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 5 # 6 UUID=4fb479dc-0364-41ac-a12d-841210d879a4 / ext4 defaults 1 1 7 UUID=30d2724b-a9be-4e32-8b9a-cf731a92173a /boot ext4 default a:在第三行添加\new mark 1, sed '1a \new mark' /tmp/fstab [root@localhost rsyslog-mysql-5.8.10]# sed '3a \new mark' /tmp/fstab # # /etc/fstab new mark # Created by anaconda on Mon Apr 13 14:19:18 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/vg0-root / ext4 defaults 1 1 UUID=90679dfa-480a-47fd-be39-e243d7a73a78 /boot ext4 defaul 2, 只要是#前都加\new mark [root@localhost rsyslog-mysql-5.8.10]# sed '/^#/a \new mark' /tmp/fstab # new mark # /etc/fstab new mark # Created by anaconda on Mon Apr 13 14:19:18 2015 new mark # new mark # Accessible filesystems, by reference, are maintained under '/dev/disk' new mark # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info new mark # new mark /dev/mapper/vg0-root / ext4 defaults 1 1 UUID=90679dfa-480a-47fd-be39-e243d7a73a78 /boot ext4 defaults n:追加 在指定行附加多行:\new mark\nsedond line\nthird [root@localhost rsyslog-mysql-5.8.10]# sed '1a \new mark\nsedond line\nthird line' /tmp/fstab new mark sedond line third line # # /etc/fstab # Created by anaconda on Mon Apr 13 14:19:18 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/vg0-root / ext4 defaults 1 1 UUID=90679dfa-480a-47fd-be39-e243d7a73a78 /boot ext4 defaults 1 2 i:插入 同上 -n于p 1,示例:将5和7行打印一份 sed '5,7p' /tmp/fstab [root@localhost rsyslog-mysql-5.8.10]# sed '5,7p' /tmp/fstab # # /etc/fstab # Created by anaconda on Mon Apr 13 14:19:18 2015 # # # Accessible filesystems, by reference, are maintained under '/dev/disk' # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 2,示例-n :将5和7行打印一份,其他静默 [root@localhost rsyslog-mysql-5.8.10]# sed -n '5,7p' /tmp/fstab # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info [root@localhost rsyslog-mysql-5.8.10]# c:替换指定的行 用指定文本替换 sed -n '5,7c' \new test' \tmp\fstab 示例: (1) 删除/boot/grub/grub.conf文件中所有行的行首的空白字符; sed 's/^[[:space:]]\+//' /boot/grub/grub.conf (2) 删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符; sed 's/^#[[:space:]]\+//' /etc/fstab (3) 把/etc/fstab文件的奇数行另存为/tmp/fstab.3; sed '1~2w /tmp/fstab.3' /etc/fstab (4) echo一个文件路径给sed命令,取出其基名;进一步地,取出其路径名; 取基名:echo "/etc/sysconfig/network-scripts/" | sed 's@^.*/\([^/]\+\)/\?$@\1@' 取路径名:echo "/etc/sysconfig/network-scripts/" | sed 's@[^/]\+/\?$@@' sed命令另一个称作"hold space"的内存空间: 这种模式一般不会被使用 高级命令: h:用模式空间中的内容覆盖保持空间的内容; H:把模式空间中的内容追加至保持空间中内容的后面; g:从保持空间中取到其内容,并将其覆盖模式空间中的内容; G:从保持空间中取到其内容,并将其追加在模式空间中的内容的后面; x:把保持空间和模式空间中的进行交换; n:读取匹配到的行的下一行至模式空间;(会覆盖模式空间中的原有内容); N:读取匹配到的行的下一行至模式空间,追加在模式空间中原有内容的后面; d:删除模式空间中的内容; D:删除多行模式空间中的首行; 注意:命令功能可使用!取反;分号可用于分隔脚本 示例: sed 'G' /etc/issue: 在文件中的每行后方添加空白行; [root@www ~]# sed 'G' /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m LinuxEA Education Learning Services http://www.linuxea.com [root@www ~]# cat /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m LinuxEA Education Learning Services http://www.linuxea.com [root@www ~]# sed '$!d' /etc/fstab:保留最后一行; [root@www ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Mon Apr 13 14:19:18 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/vg0-root / ext4 defaults 1 1 UUID=90679dfa-480a-47fd-be39-e243d7a73a78 /boot ext4 defaults 1 2 /dev/mapper/vg0-usr /usr ext4 defaults 1 2 /dev/mapper/vg0-var /var ext4 defaults 1 2 /dev/mapper/vg0-swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 172.16.249.249:/shared/nfs/ /mnt ext4 defaults 0 0 [root@www ~]# sed '/^$/d;G' /etc/issue: 保证指定的文件每一行后方有且只有一个空白行; [root@www ~]# sed '/^$/d;G' /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m LinuxEA Education Learning Services http://www.linuxea.com [root@www ~]# tail /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m LinuxEA Education Learning Services http://www.linuxea.com [root@www ~]# sed 'n;d' /etc/issue:保留奇数行; [root@www ~]# sed 'n;d' /etc/issue CentOS release 6.6 (Final) http://www.linuxea.com [root@www ~]# [root@www ~]# tail /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m LinuxEA Education Learning Services http://www.linuxea.com sed -n '1!G;h;$p' /etc/issue;反转整个文件 [root@www ~]# sed -n '1!G;h;$p' /etc/issue http://www.linuxea.com LinuxEA Education Learning Services Kernel \r on an \m CentOS release 6.6 (Final) sed '$!N;$!D' /etc/issue:显示最后两行 [root@www ~]# sed '$!N;$!D' /etc/issue http://www.linuxea.com [root@www ~]# 也可以直接:tail -2 [root@www ~]# tail -2 /etc/issue http://www.linuxea.com [root@www ~]# 哈哈,这篇文字不要太水啊。