sort命令

sort命令是Linux系统一种排序工具,它将输入文件看作由多条记录组成的数据流,而记录由可变宽度的字段组成,以换行符为定界符。sort命令与awk类似,可将记录分成多个域来处理,默认的域分隔符是空格符,域分隔符也可由用户指定。sort命令的基本格式如下:

  1. sort [选项] [输入文件]

常用sort命令选项及其意义如下:

选项 意义
-c 测试文件是否已经被排序
-k 指定排序的域
-m 合并两个已排序的文件
-n 根据数字大小进行排序
-o [输出文件] 将输出写到指定的文件,相当于将输出重定向到指定文件
-r 将排序结果逆向显示
-t 改变域分隔符
-u 去除结果中的重复行

sort命令的基本用法

1. -t选项

sort命令是分域对文件进行排序的,默认的域分隔符是空格符,-t选项可用于设置分隔符。下面看一个例子,新建一个CARGO.db的文件,用于记录笔记本品牌、产地、价格、年代、型号等信息,各域间用冒号分隔。

  1. $ cat CARGO.db
  2. ThinkPad:USA:14000:2009:X301
  3. ThinkPad:HongKong:10000:2008:T400
  4. ThinkPad:USA:8000:2007:X60
  5. HP:China:5600:2010:DM3
  6. HP:China:12000:2010:NE808
  7. SumSung:Korea:5400:2009:Q308
  8. IdeaPad:China:8000:2007:U450
  9. Acer:Taiwan:8000:2010:PT210
  10. #sort命令默认根据第1个域对数据记录进行排序,如果第1个域相同,再根据第2个域排序,以此类推。
  11. $ sort -t: CARGO.db
  12. Acer:Taiwan:8000:2010:PT210
  13. HP:China:12000:2010:NE808
  14. HP:China:5600:2010:DM3
  15. IdeaPad:China:8000:2007:U450
  16. SumSung:Korea:5400:2009:Q308
  17. ThinkPad:HongKong:10000:2008:T400
  18. ThinkPad:USA:14000:2009:X301
  19. ThinkPad:USA:8000:2007:X60

2. -k选项

从上例可以看出,sort命令默认根据第1个域对数据记录进行排序,也可以用-k选项指定某个域进行排序。sort命令用1表示第1个域,用2表示第2个域,以此类推。

  1. #根据第3个域进行排序
  2. $ sort -t: -k3 CARGO.db
  3. ThinkPad:HongKong:10000:2008:T400
  4. HP:China:12000:2010:NE808
  5. ThinkPad:USA:14000:2009:X301
  6. SumSung:Korea:5400:2009:Q308
  7. HP:China:5600:2010:DM3
  8. IdeaPad:China:8000:2007:U450
  9. ThinkPad:USA:8000:2007:X60
  10. Acer:Taiwan:8000:2010:PT210

关于-k选项更多细节,可以查看sort命令的k选项大讨论这篇文章。

3. -n选项

上例指定第3个域进行排序,尽管第3个域是数字,sort命令并没有以数字大小来排序,而是仍然以字符串方式来排序的。如果要按照数字大小来排序,就要用到-n选项。

  1. $ sort -t: -k3n CARGO.db
  2. SumSung:Korea:5400:2009:Q308
  3. HP:China:5600:2010:DM3
  4. Acer:Taiwan:8000:2010:PT210
  5. IdeaPad:China:8000:2007:U450
  6. ThinkPad:USA:8000:2007:X60
  7. ThinkPad:HongKong:10000:2008:T400
  8. HP:China:12000:2010:NE808
  9. ThinkPad:USA:14000:2009:X301

4. -r选项

-r选项用于将排序结果逆序显示。sort排序是按照从小到大进行的,带上-r选项相当于从大到小排序。

  1. $ sort -t: -k3nr CARGO.db
  2. ThinkPad:USA:14000:2009:X301
  3. HP:China:12000:2010:NE808
  4. ThinkPad:HongKong:10000:2008:T400
  5. Acer:Taiwan:8000:2010:PT210
  6. IdeaPad:China:8000:2007:U450
  7. ThinkPad:USA:8000:2007:X60
  8. HP:China:5600:2010:DM3
  9. SumSung:Korea:5400:2009:Q308

5. -u选项

-u选项用于去除排序结果中的重复行。

  1. $ sort -t: utest
  2. Acer:Taiwan:8000:2010:PT210
  3. HP:China:12000:2010:NE808
  4. HP:China:5600:2010:DM3
  5. SumSung:Korea:5400:2009:Q308
  6. SumSung:Korea:5400:2009:Q308
  7. ThinkPad:USA:14000:2009:X301
  8. ThinkPad:USA:14000:2009:X301
  9. ThinkPad:USA:14000:2009:X301
  10. $ sort -t: -u utest
  11. Acer:Taiwan:8000:2010:PT210
  12. HP:China:12000:2010:NE808
  13. HP:China:5600:2010:DM3
  14. SumSung:Korea:5400:2009:Q308
  15. ThinkPad:USA:14000:2009:X301

6. -o选项

使用-o选项可以将排序结果保存到另一个文件中。

  1. #将排序结果保存在文件SORT_CARDO.db中
  2. $ sort -t: -k3n -o SORT_CARDO.db CARGO.db
  3. $ cat SORT_CARDO.db
  4. SumSung:Korea:5400:2009:Q308
  5. HP:China:5600:2010:DM3
  6. Acer:Taiwan:8000:2010:PT210
  7. IdeaPad:China:8000:2007:U450
  8. ThinkPad:USA:8000:2007:X60
  9. ThinkPad:HongKong:10000:2008:T400
  10. HP:China:12000:2010:NE808
  11. ThinkPad:USA:14000:2009:X301

7. -c选项

-c选项用于测试文件是否已经排好序。

  1. #测试CARGO.db是否按默认方式排序,返回第一条无序信息
  2. $ sort -t: -c CARGO.db
  3. sortCARGO.db:2:无序: ThinkPad:HongKong:10000:2008:T400
  4. #测试SORT_CARGO.db是否按默认方式排序,返回第一条无序信息
  5. $ sort -t: -c SORT_CARDO.db
  6. sortSORT_CARDO.db:2:无序: HP:China:5600:2010:DM3
  7. #测试SORT_CARGO.db是否按第3个域的数值大小排序,已经排好序,Shell不提示任何信息。
  8. $ sort -t: -k3n -c SORT_CARDO.db

8. -m选项

-m选项用于将两个排好序的文件合并成一个排好序的文件。-m选项对未排序的文件合并没有意义。

  1. #CARGO2.db文件已按第3个域的数值大小排好序
  2. $ cat CARGO2.db
  3. DELL:USA:6700:2009:XPS
  4. MACBOOK:USA:10198:2010:MB991ZP/A
  5. #合并的结果也已经按第3个域的数值大小排好序
  6. $ sort -t: -k3n -m CARGO2.db SORT_CARDO.db
  7. SumSung:Korea:5400:2009:Q308
  8. HP:China:5600:2010:DM3
  9. DELL:USA:6700:2009:XPS
  10. Acer:Taiwan:8000:2010:PT210
  11. IdeaPad:China:8000:2007:U450
  12. ThinkPad:USA:8000:2007:X60
  13. ThinkPad:HongKong:10000:2008:T400
  14. MACBOOK:USA:10198:2010:MB991ZP/A
  15. HP:China:12000:2010:NE808
  16. ThinkPad:USA:14000:2009:X301

uniq命令

uniq命令可用于除去重复行,但所除去的重复行必须是连续出现的行。常用uniq命令选项及其意义如下:

选项 意义
-c 打印每行在文本中出现的次数
-d 只显示有重复的记录,每个重复记录只出现一次
-u 只显示没有重复的记录
  1. $ cat CARGO3.db
  2. ThinkPad:USA:14000:2009:X301
  3. ThinkPad:USA:14000:2009:X301
  4. ThinkPad:USA:14000:2009:X301
  5. ThinkPad:HongKong:10000:2008:T400
  6. ThinkPad:USA:8000:2007:X60
  7. HP:China:5600:2010:DM3
  8. HP:China:12000:2010:NE808
  9. SumSung:Korea:5400:2009:Q308
  10. IdeaPad:China:8000:2007:U450
  11. Acer:Taiwan:8000:2010:PT210
  12. $ uniq CARGO3.db #去除重复行
  13. ThinkPad:USA:14000:2009:X301
  14. ThinkPad:HongKong:10000:2008:T400
  15. ThinkPad:USA:8000:2007:X60
  16. HP:China:5600:2010:DM3
  17. HP:China:12000:2010:NE808
  18. SumSung:Korea:5400:2009:Q308
  19. IdeaPad:China:8000:2007:U450
  20. Acer:Taiwan:8000:2010:PT210
  21. $ uniq -c CARGO3.db #显示次数
  22. 3 ThinkPad:USA:14000:2009:X301
  23. 1 ThinkPad:HongKong:10000:2008:T400
  24. 1 ThinkPad:USA:8000:2007:X60
  25. 1 HP:China:5600:2010:DM3
  26. 1 HP:China:12000:2010:NE808
  27. 1 SumSung:Korea:5400:2009:Q308
  28. 1 IdeaPad:China:8000:2007:U450
  29. 2 Acer:Taiwan:8000:2010:PT210
  30. $ uniq -d CARGO3.db #只显示重复记录
  31. ThinkPad:USA:14000:2009:X301
  32. Acer:Taiwan:8000:2010:PT210
  33. $ uniq -u CARGO3.db #只显示没有重复的记录
  34. ThinkPad:HongKong:10000:2008:T400
  35. ThinkPad:USA:8000:2007:X60
  36. HP:China:5600:2010:DM3
  37. HP:China:12000:2010:NE808
  38. SumSung:Korea:5400:2009:Q308
  39. IdeaPad:China:8000:2007:U450

join命令

join命令用于实现两个文件中记录的连接操作,类似于关系数据库的连接操作。命令格式为join [选项] 文件1 文件2。常用join命令选项及其意义如下:

选项 意义
-a1或-a2 除了显示以共同域连接的结果外,-a1表示还显示文件1悬浮记录,-a2表示还显示文件2悬浮记录。类似于数据库的左外连接和右外连接。
-i 忽略大小写
-o 设置结果显示的格式
-t 改变域分隔符
-v1或-v2 与-a选项类似,但不显示以共同域进行连接的结果
-1和-2 -1用于设置文件1连接的域,-2用于设置文件2连接的域(默认比较文件1和文件2的第1域)
  1. $ cat TEACHER.db
  2. B Liu:Shanghai Jiaotong University:Shanghai:China
  3. C Lin:University of Toronto:Toronto:Canada
  4. D Hou:Beijing University:Beijing:China
  5. J Luo:Southeast University:Nanjing:China
  6. Y Zhang:Victory University:Melbourne:Australia
  7. $ cat TEACHER_HOBBY.db
  8. B Liu:Tea
  9. C Lin:Song
  10. J Cao:Pingpong
  11. Q Cai:Shopping
  12. Y Zhang:Photograhy
  13. Z Wu:Chess
  14. #连接TEACHER.db TEACHER_HOBBY.db(默认以文件的第1域进行连接)
  15. $ join -t: TEACHER.db TEACHER_HOBBY.db
  16. B Liu:Shanghai Jiaotong University:Shanghai:China:Tea
  17. C Lin:University of Toronto:Toronto:Canada:Song
  18. Y Zhang:Victory University:Melbourne:Australia:Photograhy
  19. #“左外连接”
  20. $ join -t: -a1 TEACHER.db TEACHER_HOBBY.db
  21. B Liu:Shanghai Jiaotong University:Shanghai:China:Tea
  22. C Lin:University of Toronto:Toronto:Canada:Song
  23. D Hou:Beijing University:Beijing:China
  24. J Luo:Southeast University:Nanjing:China
  25. Y Zhang:Victory University:Melbourne:Australia:Photograhy
  26. #“右外连接”
  27. $ join -t: -a2 TEACHER.db TEACHER_HOBBY.db
  28. B Liu:Shanghai Jiaotong University:Shanghai:China:Tea
  29. C Lin:University of Toronto:Toronto:Canada:Song
  30. J Cao:Pingpong
  31. Q Cai:Shopping
  32. Y Zhang:Victory University:Melbourne:Australia:Photograhy
  33. Z Wu:Chess
  34. #“左外连接”但不显示共同域
  35. $ join -t: -v1 TEACHER.db TEACHER_HOBBY.db
  36. D Hou:Beijing University:Beijing:China
  37. J Luo:Southeast University:Nanjing:China
  38. #“右外连接”但不显示共同域
  39. $ join -t: -v2 TEACHER.db TEACHER_HOBBY.db
  40. J Cao:Pingpong
  41. Q Cai:Shopping
  42. Z Wu:Chess
  43. #依次显示文件1的第1域、文件2的第2域、文件1的第2域
  44. $ join -t: -o1.1 2.2 1.2 TEACHER.db TEACHER_HOBBY.db
  45. B Liu:Tea:Shanghai Jiaotong University
  46. C Lin:Song:University of Toronto
  47. Y Zhang:Photograhy:Victory University
  48. $ cat AREACODE.db
  49. BEIJING:86010
  50. HONGKONG:852
  51. SHANGHAI:86021
  52. TORONTO:001416
  53. #对TEACHER.db按第3域排序,并将结果存储到TEACHER1.db文件
  54. $ sort -t: -k3 -o TEACHER1.db TEACHER.db
  55. $ cat TEACHER1.db
  56. D Hou:Beijing University:Beijing:China
  57. Y Zhang:Victory University:Melbourne:Australia
  58. J Luo:Southeast University:Nanjing:China
  59. B Liu:Shanghai Jiaotong University:Shanghai:China
  60. C Lin:University of Toronto:Toronto:Canada
  61. #以文件1的第3域和文件2的第1域进行连接,并忽略大小写
  62. $ join -t: -i -1 3 -2 1 TEACHER1.db AREACODE.db
  63. Beijing:D Hou:Beijing University:China:86010
  64. Shanghai:B Liu:Shanghai Jiaotong University:China:86021
  65. Toronto:C Lin:University of Toronto:Canada:001416

join命令在对两个文件进行连接时,两个文件必须都是连接域排好序的,按其他域排序是无效的。

cut命令

cut命令用于从标准输入或文本行中按域或行提取文本,命令格式为cut [选项] 文件。常用cut命令选项及其意义如下:

选项 意义
-c 指定提取的字符或字符范围(-cn表示第n个字符;-cn,m表示第n个字符和第m个字符;-cn-m表示第n个字符到第m个字符)
-f 指定提取的域数或域范围(用法类似于-c)
-d 改变域分隔符
  1. $ cut -c3 TEACHER.db #提取第3个字符
  2. L
  3. L
  4. H
  5. L
  6. Z
  7. $ cut -c1-5 TEACHER.db #提取第1~5个字符
  8. B Liu
  9. C Lin
  10. D Hou
  11. J Luo
  12. Y Zha
  13. $ cut -d: -f1,4 TEACHER.db #提取第1域和第4域
  14. B Liu:China
  15. C Lin:Canada
  16. D Hou:China
  17. J Luo:China
  18. Y Zhang:Australia
  19. $ cut -d: -f1-3 TEACHER.db #提取第1~3域
  20. B Liu:Shanghai Jiaotong University:Shanghai
  21. C Lin:University of Toronto:Toronto
  22. D Hou:Beijing University:Beijing
  23. J Luo:Southeast University:Nanjing
  24. Y Zhang:Victory University:Melbourne

paste命令

paste命令用于将文本文件或标准输出中的内容粘贴到新文件,它可以将来自不同文件的数据粘贴到一起。paste命令格式为paste [选项] 文件1 文件2。常用paste命令选项及其意义如下:

选项 意义
-d 设置新的域分隔符(默认分隔符是空格或Tab键)
-s 将每个文件粘贴成一行
- 从标准输入中读取数据
  1. $ cat FILE1 #FILE1的内容
  2. Shanghai Jiaotong University
  3. University of Toronto
  4. Beijing University
  5. Southeast University
  6. Victory University
  7. $ cat FILE2 #FILE2的内容
  8. Shanghai
  9. Toronto
  10. Beijing
  11. Nanjing
  12. Melbourne
  13. $ paste FILE1 FILE2 #粘贴,FILE1在前
  14. Shanghai Jiaotong University Shanghai
  15. University of Toronto Toronto
  16. Beijing University Beijing
  17. Southeast University Nanjing
  18. Victory University Melbourne
  19. $ paste FILE2 FILE1 #粘贴,FILE2在前
  20. Shanghai Shanghai Jiaotong University
  21. Toronto University of Toronto
  22. Beijing Beijing University
  23. Nanjing Southeast University
  24. Melbourne Victory University
  25. $ paste -d: FILE1 FILE2 #以:为分隔符
  26. Shanghai Jiaotong University:Shanghai
  27. University of Toronto:Toronto
  28. Beijing University:Beijing
  29. Southeast University:Nanjing
  30. Victory University:Melbourne
  31. $ paste -d@ FILE1 FILE2 #以@为分隔符
  32. Shanghai Jiaotong University@Shanghai
  33. University of Toronto@Toronto
  34. Beijing University@Beijing
  35. Southeast University@Nanjing
  36. Victory University@Melbourne
  37. $ paste -d: -s FILE1 FILE2 #按行粘贴文件,行内以:分割
  38. Shanghai Jiaotong University:University of Toronto:Beijing University:Southeast University:Victory University
  39. Shanghai:Toronto:Beijing:Nanjing:Melbourne
  40. #从标准输入读取数据,每行显示5个文件名
  41. $ ls | paste -d" " - - - - -
  42. CARGO2.db CARGO3.db CARGO.db ch4 FILE1
  43. FILE2 sample SORT_CARDO.db TEACHER1.db TEACHER.db
  44. TEACHER_HOBBY.db

join命令和paste命令在使用过程中需要注意以下几点:

  • join命令只能对排序之后的文件进行操作。
  • 使用join命令必须使用-t参数。
  • join命令对两个文件进行操作时,如果两个文件的域不相同,则只会连接具有相同域的部分,可以用-a1和-a2参数分别显示第一个文件和第二个文件中未被连接的部分。
  • 如果需要将join命令的输出写到文件,则需要进行重定向,其没有输出命令参数。
  • join命令默认的连接域是1,如果需要使用其他域,可以使用-1和-2参数指定对应的域。
  • paste命令的连接顺序和文件名称相关,没有被连接的项会被写到最后,如果想把paste的结果写到文件中,同样可以使用重定向。

split命令

split命令用于将大文件切割成小文件,split命令可以按照文件的行数、字节数切割文件,并能在输出的多个小文件中自动加上编号。split命令的基本格式为split [选项] 待切割的大文件 输出的小文件。split命令的选项及其意义如下:

选项 意义
-或-l 这两个选项等价,都用于指定切割成小文件的行数
-b 指定切割成小文件的字节
-C 与-b选项类似,但切割时尽量维持每行的完整性
  1. #将TEACHER.db每2行进行切割,输出文件以PEO.db开头命名
  2. $ split -2 TEACHER.db PEO.db
  3. $ ls PEO* #得到以下3个小文件
  4. PEO.dbaa PEO.dbab PEO.dbac
  5. $ cat PEO.dbaa #包含两条记录
  6. B Liu:Shanghai Jiaotong University:Shanghai:China
  7. C Lin:University of Toronto:Toronto:Canada
  8. $ cat PEO.dbab #包含两条记录
  9. D Hou:Beijing University:Beijing:China
  10. J Luo:Southeast University:Nanjing:China
  11. $ cat PEO.dbac #包含一条记录
  12. Y Zhang:Victory University:Melbourne:Australia

可以看到,split命令利用-2指定按2行对TEACHER.db进行切割,PEO.db指定输出小文件名,split自动在其后加上编号进行区分(编号为aa-zz)。split命令所切割生成的小文件最多包含1000行记录。

  1. #将TEACHER.db按每100B切割成小文件,此处未指定小文件的名字
  2. jerring@jerring:~/shell$ ll TEACHER.db
  3. -rw-r--r-- 1 jerring jerring 220 5 1 20:12 TEACHER.db
  4. jerring@jerring:~/shell$ split -b100 TEACHER.db
  5. jerring@jerring:~/shell$ ll x* #得到三个小文件,以x加上编号命名
  6. -rw-rw-r-- 1 jerring jerring 100 5 17 15:45 xaa
  7. -rw-rw-r-- 1 jerring jerring 100 5 17 15:45 xab
  8. -rw-rw-r-- 1 jerring jerring 20 5 17 15:45 xac
  9. #逐个查看三个小文件的内容
  10. jerring@jerring:~/shell$ cat xaa
  11. B Liu:Shanghai Jiaotong University:Shanghai:China
  12. C Lin:University of Toronto:Toronto:Canada
  13. D Hou:Bjerring@jerring:~/shell$ cat xab
  14. eijing University:Beijing:China
  15. J Luo:Southeast University:Nanjing:China
  16. Y Zhang:Victory University:jerring@jerring:~/shell$ cat xac
  17. Melbourne:Australia

split命令利用-b选项指定100B切割TEACHER.db文件,当split命令不指定小文件的名字时,将自动以x开头、aa-zz为编号对这些小文件进行命名,用ll命令查看这三个小文件发现,xaa和xab是100B,xac是20B,这说明确实按照100B的大小切割了TEACHER.db文件。但是,当用cat命令查看这三个文件时,发现每个文件内容比较凌乱,甚至存放了不完整的单词。可见,-b选项严格按照指定字节数进行切割。-C选项与-b选项类似,但-C选项不严格按照指定字节数进行切割,而是在切割时尽量维持每行的完整性。

  1. jerring@jerring:~/shell$ split -C100 TEACHER.db
  2. #三个小文件并不严格按照100B的大小进行切割
  3. jerring@jerring:~/shell$ ll x*
  4. -rw-rw-r-- 1 jerring jerring 93 5 17 15:59 xaa
  5. -rw-rw-r-- 1 jerring jerring 80 5 17 15:59 xab
  6. -rw-rw-r-- 1 jerring jerring 47 5 17 15:59 xac
  7. #逐个查看三个小文件的内容
  8. jerring@jerring:~/shell$ cat xaa
  9. B Liu:Shanghai Jiaotong University:Shanghai:China
  10. C Lin:University of Toronto:Toronto:Canada
  11. jerring@jerring:~/shell$ cat xab
  12. D Hou:Beijing University:Beijing:China
  13. J Luo:Southeast University:Nanjing:China
  14. jerring@jerring:~/shell$ cat xac
  15. Y Zhang:Victory University:Melbourne:Australia

tr命令

tr命令实现字符转换功能,其功能类似于sed命令。但是,tr命令比sed命令简单。也就是说,tr命令能实现的功能,sed命令都可以实现。尽管如此,tr命令依然是Linux系统下处理文本的常用命令。tr命令的基本格式为tr [选项] 字符串1 字符串2 <输入文件。tr命令只能从标准输入读取数据。因此,经常使用输入文件重定向和管道。tr命令选项及其意义如下:

选项 意义
-c 选定字符串1中字符集的补集,即反选字符串1中的字符集
-d 删除字符串1中出现的所有字符
-s 删除所有重复出现的字符序列,只保留一个

-d选项的用法

  1. $ cat AREACODE.db
  2. BEIJING:86010
  3. HONGKONG:852
  4. SHANGHAI:86021
  5. TORONTO:001416
  6. $ tr -d A-Z < AREACODE.db #删除所有大写字母
  7. :86010
  8. :852
  9. :86021
  10. :001416
  11. $ tr -d 0-9 < AREACODE.db #删除所有数字字符
  12. BEIJING:
  13. HONGKONG:
  14. SHANGHAI:
  15. TORONTO:
  16. $ tr -d "[\n]" < AREACODE.db #删除所有换行符
  17. BEIJING:86010HONGKONG:852SHANGHAI:86021TORONTO:001416

-s选项的用法

  1. $ cat AREACODE.db
  2. BEIJING:86010
  3. HONGKONG:852
  4. SHANGHAI:86021
  5. TORONTO:001416
  6. #将重复出现的换行符压缩成一个,即删除空白行
  7. $ tr -s "[\n]" < AREACODE.db
  8. BEIJING:86010
  9. HONGKONG:852
  10. SHANGHAI:86021
  11. TORONTO:001416
  12. #\012是\n的八进制表示方式
  13. $ tr -s "[\012]" < AREACODE.db
  14. BEIJING:86010
  15. HONGKONG:852
  16. SHANGHAI:86021
  17. TORONTO:001416
  18. $ cat REPEAT
  19. Wooooomennnn
  20. TTTTheyyyyyy
  21. $ tr -s "[a-z],[A-Z]" < REPEAT
  22. Women
  23. They

不带命令选项表示字符串替换,用字符串2替换字符串1

  1. #实现大小写字母的互换
  2. $ tr "[a-z]" "[A-Z]" < REPEAT
  3. WOOOOOMENNNN
  4. TTTTHEYYYYYY
  5. $ tr "[A-Z]" "[a-z]" < REPEAT
  6. wooooomennnn
  7. ttttheyyyyyy
  8. #tr命令支持POSIX字符类,因此上面两条命令等价于下面两条命令
  9. $ tr "[:lower:]" "[:upper:]" < REPEAT
  10. WOOOOOMENNNN
  11. TTTTHEYYYYYY
  12. $ tr "[:upper:]" "[:lower:]" < REPEAT
  13. wooooomennnn
  14. ttttheyyyyyy

-c选项的用法

  1. #首先将不在"[a-z][A-Z]"字符集内的字符替换为换行符
  2. #然后-s选项将重复出现的换行符压缩成一个
  3. #总的效果就是将AREACODE.db文件中冒号、数字和空白行删除
  4. $ tr -cs "[a-z][A-Z]" "[\012*]" < AREACODE.db
  5. BEIJING
  6. HONGKONG
  7. SHANGHAI
  8. TORONTO

tar命令

tar命令是Linux的归档命令,通俗地说,tar命令实现了Linux系统文件的压缩和解压缩。它的基本格式为tar [选项] 文件名或目录名。tar命令的选项比较多,常用的命令选项如下:

选项 意义
-c 创建新的包
-r 为包添加新的文件
-t 列出包内容
-u 更新包中的文件,若无此文件,则将该文件添加到包中
-x 解压缩文件
-f 使用压缩文件或设备,该选项通常是必选的
-v 详细报告tar处理文件的信息
-z 用gzip压缩和解压缩文件,若加上此选项创建压缩包,那么解压缩也需要加上此选项

下面举例说明tar命令的基本用法。

-c和-f选项的用法

  1. #列出当前目录下所有以.db结尾的文件
  2. $ls *.db
  3. AREACODE.db CARGO3.db SORT_CARDO.db TEACHER.db
  4. CARGO2.db CARGO.db TEACHER1.db TEACHER_HOBBY.db
  5. #创建压缩包db.all,将当前目录下所有以.db结尾的文件放入压缩包
  6. $ tar -cf db.all *.db
  7. #查看db.all压缩包的内容,all.db确实包含所有以.db结尾的文件
  8. $ tar -tf db.all
  9. AREACODE.db
  10. CARGO2.db
  11. CARGO3.db
  12. CARGO.db
  13. SORT_CARDO.db
  14. TEACHER1.db
  15. TEACHER.db
  16. TEACHER_HOBBY.db

-r选项的用法

  1. $ tar -rf db.all log* #将以log开头的文件添加到db.all中
  2. $ tar -tf db.all #查看db.all的内容
  3. AREACODE.db
  4. CARGO2.db
  5. CARGO3.db
  6. CARGO.db
  7. SORT_CARDO.db
  8. TEACHER1.db
  9. TEACHER.db
  10. TEACHER_HOBBY.db
  11. log #新添加的文件
  12. log1 #新添加的文件

tar命令的-u选项用于更新包中的文件。例如,我们对TEACHER.db文件进行修改,需要将修改后的TEACHER.db文件添加到db.all包,那么只需要使用命令tar -uf db.all TEACHER.db,就可实现TEACHER.db文件的更新操作。如果包中不存在需要更新的文件,那么tar -u就将该文件添加到包中。因此,从这个角度讲,-u选项也可用于为包添加新文件,-u选项能代替-r选项。

tar命令的另一重要功能就是解压缩。Linux系统下有很多种压缩包格式,如.tar、.gz、.tar.gz、.tgz和.Z等结尾的压缩包名。从应用的角度来说,我们没必要搞清楚这些不同格式压缩包的区别,也无须用不同的命令来对这些不同格式的包解压缩。Linux系统下两个通用的解压命令的格式如下:

  1. tar -xvf 压缩包名称 #解压非gzip格式的压缩包
  2. tar -zxvf 压缩包名称 #解压gzip格式的压缩包

上述两种tar命令分别针对非gzip格式和gzip格式,加上-z选项可以解压用gzip压缩的文件,-x选项表示解压缩文件,-v选项能生成解压缩过程的状态信息,-f选项是必选选项。下面举一个例子:

  1. $ tar -zxvf db.all #db.all非gzip格式,加上-z选项解压出错
  2. gzip: stdin: not in gzip format
  3. tar: Child returned status 1
  4. tar: Error is not recoverable: exiting now
  5. $ tar -xvf db.all #去掉-z选项,解压db.all成功
  6. AREACODE.db #加上-v选项才生成这些解压出的文件信息
  7. CARGO2.db
  8. CARGO3.db
  9. CARGO.db
  10. SORT_CARDO.db
  11. TEACHER1.db
  12. TEACHER.db
  13. TEACHER_HOBBY.db
  14. log
  15. log1

tar -cf命令创建的包实际上是将多个文件放到一起,此时文件并没有被压缩。gzip命令是Linux系统下常用的压缩工具,它可以对tar命令创建的包进行压缩,但是,gzip所生成的压缩包使用tar -zxvf命令就可解压缩。下面举一个例子:

  1. $ ll db.all #使用gzip压缩前占据20480B
  2. -rw-rw-r-- 1 jerring jerring 20480 5 17 17:23 db.all
  3. $ gzip db.all
  4. $ ls *.gz
  5. db.all.gz
  6. $ ll db.all.gz #使用gzip压缩后占据822B
  7. -rw-rw-r-- 1 jerring jerring 822 5 17 18:15 db.all.gz
  8. $ tar -zxvf db.all.gz
  9. AREACODE.db
  10. CARGO2.db
  11. CARGO3.db
  12. CARGO.db
  13. SORT_CARDO.db
  14. TEACHER1.db
  15. TEACHER.db
  16. TEACHER_HOBBY.db
  17. log
  18. log1

上例用gzip命令压缩db.all包,生成db.all.gz文件,db.all.gz和db.all的包含的文件是相同的,只是db.all.gz文件经过了压缩,占用空间比较小;由于db.all.gz是gzip格式的压缩文件,利用tar命令对其解压时,需要加上-z选项。当然,gzip命令也可将db.all.gz文件还原成db.all文件,只要在gzip命令后加上-d选项即可。

  1. $ gzip -d db.all.gz #将db.all.gz解压缩
  2. $ ls db.*
  3. db.all #gzip -d的结果仍然是包

gzip -d对db.all.gz的处理也称为解压缩,它得到的是包,而tar -zxvf命令可以直接得到包内的文件。

本章的内容极为丰富,介绍了Linux的文本处理命令,sort命令是一种文本排序工具;uniq命令可以去除文本的重复记录,而且可以统计重复文本行的数量;join命令用于实现类似关系数据库的连接操作;cut命令用于从标准输入或文本文件中按域或行提取文本;paste命令用于将多个文本文件或标准输出中的内容粘贴而形成新的文件;split命令用于将大文件切割成小文件;tr命令实现字符转换功能,可以实现文本文件的过滤功能;tar命令是Linux的归档命令,tar命令和gzip命令用于实现Linux系统文件的压缩和解压缩。这些功能强大的Linux文本处理命令经常出现在各种Shell脚本程序中,是Shell编程的基础。

Linux Shell编程第5章——文件的排序、合并和分割的更多相关文章

  1. Linux Shell编程第4章——sed和awk

    目录 sed命令基本用法 sed命令实例 命令选项 文本定位 编辑命令 awk编程模型 awk编程实例 1.awk模式匹配 2.记录和域 3.关系和布尔运算符 4.表达式 5.系统变量 6.格式化输出 ...

  2. Linux Shell编程第3章——正则表达式

    目录 正则表达式基础 正则表达式的扩展 通配 grep命令 正则表达式基础 Linux Shell以字符串作为表达式向系统传达意思.元字符(Metacharacters)是用来阐述字符表达式意义的字符 ...

  3. Linux Shell编程第1章——Shell脚本编程概述

    目录 Linux和Shell简介 Linux是一套可免费使用和自由传播的类UNIX操作系统.Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令,并把它送 ...

  4. Linux Shell编程第2章——Linux文件系统

    目录 用户和用户组管理 用户管理常用命令 用户组管理常用命令 文件和目录操作 文件操作常用命令 目录操作常用命令 文件和目录权限管理 文件查找--find 用户和用户组管理 用户管理常用命令 用户的角 ...

  5. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

  6. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

  7. linux —— shell 编程(编程语法)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...

  8. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  9. Linux Shell编程参考大全

    本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...

随机推荐

  1. Ladies' Choice UVALive - 3989 稳定婚姻问题 gale_shapley算法

    /** 题目: Ladies' Choice UVALive - 3989 链接:https://vjudge.net/problem/UVALive-3989 题意:稳定婚姻问题 思路: gale_ ...

  2. Service Mesh服务网格新生代--Istio(转)

    万字解读:Service Mesh服务网格新生代--Istio  官网地址:https://preliminary.istio.io/zh/docs/concepts/security/ Servic ...

  3. 【BZOJ】3300: [USACO2011 Feb]Best Parenthesis(模拟)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3300 这个细节太多QAQ 只要将所有的括号'('匹配到下一个')'然后dfs即可 简单吧,,, #i ...

  4. Ideal-image-slider 幻灯片实例演示

    链接:http://zaixianshouce.iteye.com/blog/2316300 http://www.shouce.ren/study/api/s/jq--5733e32bf23bb-- ...

  5. (转)java enum枚举

    转载自: 原理:http://singleant.iteye.com/blog/686349 应用:http://www.cnblogs.com/happyPawpaw/archive/2013/04 ...

  6. spark(1.1) mllib 源码分析(二)-相关系数

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/4024733.html 在spark mllib 1.1版本中增加stat包,里面包含了一些统计相关的函数 ...

  7. 【VBA】合并多个excel文件

    From http://www.zhihu.com/question/20366713 VBA代码如下: Sub 工作薄间工作表合并() Dim FileOpen Dim X As Integer A ...

  8. JAVA“找不到或无法加载主类” 问题的解决办法

    http://blog.csdn.net/l_ong211314/article/details/8004975

  9. 12 个免费在线的 Web 网站性能测试工具

    https://www.oschina.net/news/21033/12-free-online-tools-for-website-testing

  10. 将BT转为磁力链接

    实战代码 安装完成后,我们来看下代码: 系统环境:Linux Python环境:Python2.7 请注意python版本 bt2url.py 1 2 3 4 5 6 7 8 9 10 11 12 1 ...