文本处理工具-sed练习

1. 删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符

[root@centos7 ~]#sed -r 's@^[[:space:]]*@@g' /etc/grub2.cfg

2. 删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

[root@centos7 ~]#sed -r 's@^#[[:space:]]*@@g' /etc/fstab


/etc/fstab
Created by anaconda on Sat Jul 21 17:21:15 2018

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=2f515bb9-2f04-4bf9-a175-b4b97cb1ffe9 /                       xfs     defaults        0 0
UUID=cfbcc91d-154f-42a4-8472-1ee3c6fd6779 /boot                   xfs     defaults        0 0
UUID=6fdda150-e373-4498-be24-799aba09b992 /data                   xfs     defaults        0 0
UUID=ff89169c-fa8e-452f-a36e-2131bf1187c4 swap                    swap    defaults        0 0

3. 在centos6系统/root/install.log每一行行首增加#号

[root@centos6 ~]$sed 's@^@#@' /root/install.log

4. 在/etc/fstab文件中不以#开头的行的行首增加#号

[root@centos6 ~]$sed 's@^[^#]@#@' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sun Jul 22 00:44:21 2018
#
# 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
#
#UID=11ab0970-a6e7-46e1-8ae3-245033b1212b /                       ext4    defaults        1 1
#UID=e37ea461-b235-492c-9454-27a5015cf4a6 /boot                   ext4    defaults        1 2
#UID=41a32465-94d5-467d-bb17-2a7d433ad7f8 /data                   ext4    defaults        1 2
#UID=e48da81a-84fc-4d46-8882-f8e7acbc5eec swap                    swap    defaults        0 0
#mpfs                   /dev/shm                tmpfs   defaults        0 0
#evpts                  /dev/pts                devpts  gid=5,mode=620  0 0
#ysfs                   /sys                    sysfs   defaults        0 0
#roc                    /proc                   proc    defaults        0 0

5. 处理/etc/fstab路径,使用sed命令取出其目录名和基名

[root@centos7 root2018-08-01]#echo "/etc/fstab/" | sed -r 's@(.*)/$@\1@' | sed -r 's@^(.*/)(.*)$@\2@'
fstab

[root@centos7 root2018-08-01]#echo "/etc/fstab/" | sed -r 's@(.*)/$@\1@' | sed -r 's@^(.*/)(.*)$@\1@'
/etc/
[root@centos7 ~]#echo "/etc/sysconfig/network-scripts/" | sed -r 's@(^.*/)([^/]+)/?@\1@'
/etc/sysconfig/
[root@centos7 ~]#echo "/etc/sysconfig/network-scripts/" | sed -r 's@(^.*/)([^/]+)/?@\2@'
network-scripts

6. 利用sed 取出ifconfig命令中本机的IPv4地址

[root@centos7 root2018-08-01]#ifconfig | sed -n '2p' | sed -r 's@[[:space:]]*inet (addr:)?@@' |sed -r 's@[[:space:]].*$@@'
192.168.32.132

[root@centos6 ~]$ifconfig | sed -n '2p' | sed -r 's@[[:space:]]*inet (addr:)?@@' |sed -r 's@[[:space:]].*$@@'
192.168.32.131

7. 统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数

[root@centos7 Packages]#ls | sed -r -e 's@^(.*)\..*@\1@' -e 's@^.*\.(.*)@\1@' |sort |uniq -c
   2223 i686
   3117 noarch
      1 TRANS
   4571 x86_64
[root@centos7 Packages]#ls | sed -r 's@.*\.(.*)\.rpm$@\1@' |sort|uniq -c
   2223 i686
   3117 noarch
      1 TRANS.TBL
   4571 x86_64

8. 计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)

[root@centos7 root2018-08-01]#egrep -w -o  "\b[[:alnum:]_]+\b" /etc/init.d/functions |sort | uniq -c |sort -nr
    113 1
     60 if
     54 return
     52 then
     51 fi
     49 echo

9. 将文本文件的n和n+1行合并为一行, n为奇数行

nl /etc/passwd |sed 'N;s/\n//'

综合练习

文件名sedfile
++++++++++++++++++++
Steve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300
Betty Boop:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500
Igor Chevsky:385-375-8395:3567 Populus Place, Caldwell, NJ 23875:6/18/68:23400
Norma Corder:397-857-2735:74 Pine Street, Dearborn, MI 23874:3/28/45:245700
Jennifer Cowan:548-834-2348:583 Laurel Ave., Kingsville, TX 83745:10/1/35:58900
Jon DeLoach:408-253-3122:123 Park St., San Jose, CA 04086:7/25/53:85100
Karen Evich:284-758-2857:23 Edgecliff Place, Lincoln, NB 92086:7/25/53:85100
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
Fred Fardbarkle:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900
Fred Fardbarkle:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900
Lori Gortz:327-832-5728:3465 Mirlo Street, Peabody, MA 34756:10/2/65:35200
Paco Gutierrez:835-365-1284:454 Easy Street, Decatur, IL 75732:2/28/53:123500
Ephram Hardy:293-259-5395:235 CarltonLane, Joliet, IL 73858:8/12/20:56700
James Ikeda:834-938-8376:23445 Aster Ave., Allentown, NJ 83745:12/1/38:45000
Barbara Kertz:385-573-8326:832 Ponce Drive, Gary, IN 83756:12/1/46:268500
Lesley Kirstin:408-456-1234:4 Harvard Square, Boston, MA 02133:4/22/62:52600
William Kopf:846-836-2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Sir Lancelot:837-835-8257:474 Camelot Boulevard, Bath, WY 28356:5/13/69:24500
Jesse Neal:408-233-8971:45 Rose Terrace, San Francisco, CA 92303:2/3/36:25000
Zippy Pinhead:834-823-8319:2356 Bizarro Ave., Farmount, IL 84357:1/1/67:89500
Arthur Putie:923-835-8745:23 Wimp Lane, Kensington, DL 38758:8/31/69:126000
Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:3/19/35:22350
Jose Santiago:385-898-8357:38 Fife Way, Abilene, TX 39673:1/5/58:95600
Tommy Savage:408-724-0140:1222 Oxbow Court, Sunnyvale, CA 94087:5/19/66:34200
Yukio Takeshida:387-827-1095:13 Uno Lane, Ashville, NC 23556:7/1/29:57000
Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900

1.把Jon的名字改成Jonathan.

[root@centos7 root2018-08-01]#sed 's@Jon@Jontan@g' sedfile.txt

2.删除头三行

[root@centos7 root2018-08-01]#sed '1,3d' sedfile.txt 
Norma Corder:397-857-2735:74 Pine Street, Dearborn, MI 23874:3/28/45:245700 
Jennifer Cowan:548-834-2348:583 Laurel Ave., Kingsville, TX 83745:10/1/35:58900 
Jon DeLoach:408-253-3122:123 Park St., San Jose, CA 04086:7/25/53:85100 
Karen Evich:284-758-2857:23 Edgecliff Place, Lincoln, NB 92086:7/25/53:85100 
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200 
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200 
Fred Fardbarkle:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:7809

3.显示5-10行

[root@centos7 root2018-08-01]#sed -n '5,10p' sedfile.txt 
Jennifer Cowan:548-834-2348:583 Laurel Ave., Kingsville, TX 83745:10/1/35:58900 
Jon DeLoach:408-253-3122:123 Park St., San Jose, CA 04086:7/25/53:85100 
Karen Evich:284-758-2857:23 Edgecliff Place, Lincoln, NB 92086:7/25/53:85100 
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200 
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200 
Fred Fardbarkle:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900

4.删除包含Lane的行.

[root@centos7 root2018-08-01]#sed '/Lane/d' sedfile.txt

5.显示所有生日在November-December之间的行

sed -n '/:1[1-2]\/.*/p' sedfile.txt
[root@centos7 root2018-08-01]#sed -r -n '/:1[1-2]\/[1-3]?[1-9]\//p' sedfile.txt
Steve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300 
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200 
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200 
James Ikeda:834-938-8376:23445 Aster Ave., Allentown, NJ 83745:12/1/38:45000 
Barbara Kertz:385-573-8326:832 Ponce Drive, Gary, IN 83756:12/1/46:268500

6.把三个星号(***)添加到Fred开头的行

[root@centos7 root2018-08-01]#sed -r 's@(^Fred)@***\1@' sedfile.txt

7.用JOSE HAS RETIRED取代包含Jose的行

c选项替换一行!

sed '\@Jose@c \JOSE HAS RETIRED' sedfile.txt
[root@centos7 root2018-08-01]#sed 's@.*Jose.*@JOSE HAS RETIRED@' sedfile.txt 
Steve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300 
Betty Boop:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500 
Igor Chevsky:385-375-8395:3567 Populus Place, Caldwell, NJ 23875:6/18/68:23400 
Norma Corder:397-857-2735:74 Pine Street, Dearborn, MI 23874:3/28/45:245700 
Jennifer Cowan:548-834-2348:583 Laurel Ave., Kingsville, TX 83745:10/1/35:58900 
JOSE HAS RETIRED

8.把Popeye的生日改成11/14/46

[root@centos7 root2018-08-01]#sed -n '/^Popeye/p' sedfile.txt |sed -r 's@:[0-9]+/[0-9]+/[0-9]+:@:11/14/46:@'
Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:11/14/46:22350

9.删除所有空白行

[root@centos7 root2018-08-01]#sed '/^$/d' sedfile.txt

10.写一个脚本

  • .在第一行之前插入标题PERSONNEL FILE.
  • .删除以500结尾的工资
  • .显示文件内容,把姓和名颠倒
  • .在文件末尾添加THE END

sed.sh文件内容如下:

#! /bin/bash

sed '1i\PERSONNEL FILE.' sedfile.txt 
sed '/500\b/d' sedfile.txt
sed -r 's@^(.*):[0-9]{3}-.*@\1@' sedfile.txt | sed -r 's@(.*)[[:space:]](.*)@\2 \1@'
sed '$a\ THE END' sedfile.txt

你可能感兴趣的:(Linux)