sed 练习

本文介绍了如何使用sed命令对文本文件进行各种操作,包括删除指定字符、交换字符位置、打印特定行等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原出处: http://hi.baidu.com/pmghong/item/f0aae72a214d057fc28d596c

http://hi.baidu.com/pmghong/item/9ea6da28be3fa3e6a4275a69

 这两天在培训RHCE的课程里面讲的是sed和awk,初次接触这俩东西,用起来还真是要命,那些符号一多,看起来就晕了,赶紧整理下笔记先。


sed01.txt 内容如下:


=========================================================

 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin      sync:x:5:0:sync:/sbin:/bin/sync  shutdown:x:6:0:shut down:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin    operator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologin  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin  fTP:x:14:50:FTP User:/var/ftp:/sbin/nologin  nobody:x:99:99:NOBody:/:/sbin/nologin





===========================================================






对sed01.txt 作如下操作。 

1、删除文件每行的第一个非空字符。 

[student@teacher doc]$ cat sed01.txt |sed 's/[^[:space:]]//' 

 

2、删除文件每行的第二个非空字符。 

[student@teacher doc]$ cat sed01.txt |sed 's/\([^[:space:]]\)\([^[:space:]]\)/\1/' 

 

3、删除文件每行的最后一个字符。 

[root@client tmp]# sed 's/[a-z]$//' sed01.txt root:x:0:0:root:/root:/bin/bas 

 

4、删除文件每行的倒数第二个字符。 

[root@client tmp]# sed 's/\([a-z]\)\([a-z]$\)/\2/' sed01.txt root:x:0:0:root:/root:/bin/bah 

 

5、删除文件每行的第二个单词。 

[student@teacher doc]$ cat sed01.txt |sed 's/\([a-zA-Z]\{1,\}\)\([^a-zA-Z]\{1,\}\)\([a-zA-Z]\{1,\}\)/\1\2/' 

 

6、删除文件每行的倒数第二个单词。 

[root@client tmp]# sed 's/\(.*:\/\)\([a-z]\{1,\}\)\(\/[a-z]\{1,\}\)/\1\3/' sed01.txt root:x:0:0:root:/root://bash bin:x:1:1:bin:/bin://nologin 

 

7、删除文件每行的最后一个单词。 

[root@client tmp]# sed 's/[a-z]\{1,\}$//' sed01.txt root:x:0:0:root:/root:/bin/ bin:x:1:1:bin:/bin:/sbin/ 

 

8、交换每行的第一个字符和第二个字符。 [root@client tmp]# sed 's/\([a-zA-Z]\)\([a-zA-Z]\)/\2\1/' sed01.txt orot:x:0:0:root:/root:/bin/bash ibn:x:1:1:bin:/bin:/sbin/nologin 

 

9、交换每行的第一个字符和第二个单词。 [root@client tmp]# sed 's/\([a-zA-Z]\)\([a-zA-Z]\{1,\}:x:[^a-zA-Z]\{1,\}\)\([a-zA-Z]\{1,\}\)/\3\2\1/' sed01.txt rootoot:x:0:0:r:/root:/bin/bash binin:x:1:1:b:/bin:/sbin/nologin 

 

10、交换每行的第一个单词和最后一个单词。 

cat sed01.txt |sed 's/\([a-zA-Z]\{1,\}\)\([^a-zA-Z]\{1,\}.*[^a-zA-Z]\{1,\}\)\([a-zA-Z]\{1,\}$\)/\3\2\1/' 

 

11、删除一个文件中所有的数字。 

cat sed01.txt |sed 's/[0-9]//g' 

 

12、删除每行开头的所有空格。 

cat sed01.txt |sed 's/^[ ]\{1,\}//' 

 

13、用制表符替换文件中出现的所有空格。 

[student@teacher doc]$ cat sed01.txt |sed 's/[ ]/\t/g' 

 

14、把所有大写字母用括号()括起来。 

[root@client tmp]# sed 's/[A-Z]/(&)/g' sed01.txt f(T)(P):x:14:50:(F)(T)(P) (U)ser:/var/ftp:/sbin/nologin nobody:x:99:99:(N)(O)(B)ody:/:/sbin/nologin 

 

15、打印每行3次。 

[student@teacher doc]$ cat sed01.txt |sed 'p;p' [student@teacher doc]$ cat sed01.txt |sed 's/.*/&\n&\n&/'



16、只显示每行的第一个单词。

[root@client tmp]# sed 's/\([a-zA-Z]\{1,\}\)\(..*\)/\1/' sed01.txt

root bin daemon



17,将格式为 mm/yy/dd 的日期格式换成 mm;yy;dd 

[student@teacher doc]$ date +%m/%Y/%d |sed 's/\//;/g' date +%m/%Y/%d |sed 's#/#;#g' 


材料:
=============================================================
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 92743: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, Duluth, MN 23850:4/12/23:780900


Fred Fardbarkle:674-843-1385:20 Parak Lane, Duluth, 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
======================================================================


对sed02.txt作如下操作:
用 sed 实现
1. Change the name Jon to Jonathan.
[root@client tmp]# sed -n 's/Jon/Jonathan/p' sed02.txt
Jonathan DeLoach:408-253-3122:123 Park St., San Jose, CA 04086:7/25/53:85100

2. Delete the first three lines.
[root@client tmp]# cat -n sed02.txt|sed '1,3d'
     4  Norma Corder:397-857-2735:74 Pine Street, Dearborn, MI 23874:3/28/45:245700
     5  Jennifer Cowan:548-834-2348:583 Laurel Ave., Kingsville, TX 83745:10/1/35:58900

3. Print lines 5 through 10.
[root@client tmp]# cat sed01.txt |sed -n '5,10p'
        lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync
         shutdown:x:6:0:shut down:/sbin:/sbin/shutdown
        halt:x:7:0:halt:/sbin:/sbin/halt
         mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

4. Delete lines containing Lane.
[root@client tmp]# sed 's/Lane//' sed02.txt

5. Print all lines where the birthdays are in November or December.
[root@client tmp]# sed -n '/:1[12]\//p' sed02.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. Append three asterisks to the end of lines starting with Fred.
[root@student04 tmp]# sed -n 's/^Fred.*/& ***/p' sed02.txt 
Fred Fardbarkle:674-843-1385:20 Parak Lane, Duluth, MN 23850:4/12/23:780900 ***
Fred Fardbarkle:674-843-1385:20 Parak Lane, Duluth, MN 23850:4/12/23:780900 ***
Fred Fardbarkle:674-843-1385:20 Parak Lane, Duluth, MN 23850:4/12/23:780900 ***
Fred Fardbarkle:674-843-1385:20 Parak Lane, Duluth, MN 23850:4/12/23:780900 ***

7. Replace the line containing Jose with JOSE HAS RETIRED.
[root@client tmp]# sed -n 's/Jose/JOSE HAS RETIRED/p' sed02.txt
Jon DeLoach:408-253-3122:123 Park St., San JOSE HAS RETIRED, CA 04086:7/25/53:85100
JOSE HAS RETIRED Santiago:385-898-8357:38 Fife Way, Abilene, TX 39673:1/5/58:95600

8. Change Popeye's birthday to 11/14/46. Assume you don't know Popeye's original birthday. Use a regular expression to search for it.
[root@student04 tmp]# sed -n '/Popeye/s#[0-9]\{1,2\}/[0-9]\{1,2\}/[0-9]\{2\}#11/14/46#p' sed02.txt 
Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:11/14/46:22350
Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:11/14/46:22350

9. Delete all blank lines.
[root@client tmp]# sed '/^$/d' sed02.txt

10. Write a sed script that will
a. Insert above the first line the title PERSONNEL FILE.
[root@client tmp]# sed '1i PERSONNEL FILE' sed02.txt
PERSONNEL FILE
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

b. Remove the salaries ending in 500.
[root@client tmp]# sed '/500$/d' sed02.txt

c. Print the contents of the file with the last names and first names reversed.
[root@client tmp]# sed 's/\([a-zA-Z]\{1,\}\)\([^a-zA-Z]\)\([a-zA-Z]\{1,\}\)/\3\2\1/' sed02.txt
Blenheim Steve:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300
Boop Betty:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500

d. Append at the end of the file THE END.
[root@client tmp]# sed '$a THE END' sed02.txt
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
THE END

11. 打印出生日月份是9月和11月的
[root@student04 tmp]# sed -n -r '/:(9|11)\//p' sed02.txt 
teve 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
William Kopf:846-836-2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900
teve 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
William Kopf:846-836-2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900

### 回答1: 1. 使用awk命令,将一个文件中的第一列和第二列相加,并输出结果。 2. 使用sed命令,将一个文件中的所有空行删除,并输出结果。 3. 使用grep命令,查找一个文件中包含特定字符串的行,并输出结果。 4. 使用awk命令,将一个文件中的所有行按照第二列进行排序,并输出结果。 5. 使用sed命令,将一个文件中的所有单词转换为大写,并输出结果。 6. 使用grep命令,查找一个文件中不包含特定字符串的行,并输出结果。 7. 使用awk命令,将一个文件中的所有行按照第一列进行分组,并输出结果。 8. 使用sed命令,将一个文件中的所有行反转,并输出结果。 9. 使用grep命令,查找一个文件中包含特定字符串的行数,并输出结果。 10. 使用awk命令,将一个文件中的所有行按照第三列进行筛选,并输出结果。 ### 回答2: awk、sed和grep是Linux系统中常见的文本处理工具,它们可以对文本进行搜索、替换、过滤、格式化等操作。以下是一些常见的练习题,可以帮助读者加深对这些工具的理解和掌握它们的使用技巧。 1. 使用awk命令统计日志文件中每个IP的访问次数。 awk '{a[$1]++} END {for(i in a) print i, a[i]}' logfile 其中,a[$1]++用于统计IP的访问次数,END子句用于在处理完整个文件后输出结果。 2. 使用sed命令批量重命名文件夹中所有的.jpg文件为.png。 sed -i 's/\.jpg/\.png/g' $(find /path/to/folder -type f -name '*.jpg') 其中,-i选项表示直接修改原文件,使用find命令来查找所有.jpg文件,并将其替换为.png。 3. 使用grep命令查找一个目录下所有包含“Linux”关键字的文件,并输出匹配结果。 grep -r "Linux" /path/to/directory 其中,-r选项表示递归查找所有文件,如果找到匹配项,则会输出所在的文件名和匹配的行。 4. 使用awk命令从一组数字中找出最大值和最小值,并计算它们的平均数。 echo "1 2 3 4 5" | awk 'BEGIN {max=0;min=999999} {for(i=1;i<=NF;i++) if($i>max) max=$i;else if($i<min) min=$i;total+=$i} END {print "Max:",max,"Min:",min,"Avg:",total/NF}' 其中,BEGIN子句用于初始化max和min变量,NF表示输入行的字段数量,END子句用于计算平均数。 以上是关于awk、sed和grep的基础练习题,掌握了这些基本操作后,读者可以尝试更复杂的文本处理任务,如去重、排序、计数等。同时,多查阅相关文档和资料,不断练习,可以更好地掌握这些工具。 ### 回答3: awk、sed、grep三者是Linux中常用的文本处理命令,它们都可以用来处理大量的文本信息。下面是一些实践练习。 1. 使用grep 给定一个文件file.txt,其中的每行都是一个字符串,找出其中包含字符串“hello”的所有行并输出到一个新的文件new.txt。 grep "hello" file.txt > new.txt 2. 使用awk 给定一个包含三列的文件file.txt(英语、数学和科学的成绩),找出其中科学成绩大于80分的所有学生。 awk '$3>80{print $0}' file.txt 3. 使用sed 给定一个文件file.txt,其中有若干行英文句子,将其中所有的小写字母转换为大写字母。 sed 's/[a-z]/\U&/g' file.txt 4. 使用grep和awk 给定一个包含多个文件的目录dir,找出其中含有文件名“error.log”的文件,并统计各个文件中“error”单词出现的总次数。 grep -l "error.log" dir/* | xargs awk '{count +=gsub(/error/,"&")}END{print count}' 以上是一些常用的练习题,可以帮助大家熟悉和掌握这些常用命令的使用方法。需要注意的是,在实践过程中,应该多加尝试,有问题及时查阅相关文档或寻求帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值