• Linux Shell编程第5章——文件的排序、合并和分割


    [TOC]

    sort命令

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

    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. sort:CARGO.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 51 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 517 15:45 xaa
    7. -rw-rw-r-- 1 jerring jerring 100 517 15:45 xab
    8. -rw-rw-r-- 1 jerring jerring 20 517 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 517 15:59 xaa
    5. -rw-rw-r-- 1 jerring jerring 80 517 15:59 xab
    6. -rw-rw-r-- 1 jerring jerring 47 517 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 517 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 517 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编程的基础。

  • 相关阅读:
    java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
    gif动态图怎么制作?gif动态图在线制作一键搞定
    C++模拟OpenGL库——图形学状态机接口封装(二):基于状态机接口的画线&画三角形
    SecureCRT 9.4.2 for Mac
    CSS常见选择器总结
    米家、homekit、智汀更看好哪一个?看完你就明白了
    微服务框架 SpringCloud微服务架构 17 初识ES 17.6 安装IK 分词器
    想完全掌握Swagger,这一篇就够了!
    SQL 存储过程优化
    【云原生之Docker实战】使用Docker部署Filebrowser文件管理系统
  • 原文地址:https://blog.csdn.net/weixin_72426331/article/details/127346025