Linux系统命令行小技巧:wc、sort、sed 和 tr

时间:2021-10-11 23:23:26

Linux 发行版十分好用,而且它们有一些用户可能不知道的技巧。让我们来看看一些命令行实用工具,当你热衷于终端而不是 GUI 时,它们可能更顺手。

我们都知道在一个系统上使用终端会更高效。当你编辑和排版一个文本文件时,终端会让你确切的感受到,生活如此简单。

本文将向你介绍 wc、sort、tr 和 sed 命令。

Linux系统命令行小技巧:wc、sort、sed 和 tr

1. wc

wc 是一个实用工具,全称是 “word count”。顾名思义,它可以用来统计任何文件的行数、单词数和字节数。

让我们来看看它是如何工作的:

  1. $ wc filename 
  2. lines words characters filename 

输出的是文件的行数、单词数、字符数和文件名。

想获得特定的输出,我们必须使用选项:

  • -c 打印字节总数
  • -l 打印行数
  • -w 打印单词总数
  • -m 打印字符总数

wc 示例

让我们来看看它的运行结果。

让我们从一个文本文件 lormipsm.txt 开始。首先,我们通过 cat 查看文件内容,然后使用 wc:

  1. $ cat loremipsm.txt 
  2. Linux is the best-known and most-used open source operating system. 
  3. As an operating system, Linux is software that sits underneath all of the other software on a computer, 
  4. receiving requests from those programs and replaying these requests to the computer's hardware. 
  5. $ wc loremipsm.txt 
  6. 3 41 268 loremipsm.txt 

假设我只想查看文件的字节数:

  1. $ wc -c loremipsm.txt 
  2. 268 loremipsm.txt 

查看文件的行数:

  1. $ wc -l loremipsm.txt 
  2. 3 loremipsm.txt 

查看文件的单词数:

  1. $ wc -w loremipsm.txt 
  2. 41 loremipsm.txt 

现在只查看文件的字符数:

  1. $ wc -m loremipsm.txt 
  2. 268 loremipsm.txt 

2. sort

sort 命令是最有用的工具之一。它会对文件的数据进行排序。可以根据字符或数字进行升序或降序排列。它也可以用来对文件中的行进行排序和随机化。

使用 sort 非常简单。我们需要做的仅仅是提供一个文件名:

  1. $ sort filename 

默认的是按照字母顺序对数据进行排序。需要注意的是 sort 命令仅仅是对数据进行排序展示。它并不会改写文件。

使用 sort 命令的一些有用的选项:

  • -r 将文件中的行按倒序进行排序
  • -R 将文件中的行打乱为随机顺序
  • -o 将输出保存到另一个文件中
  • -k 按照特定列进行排序
  • -t 使用指定的分隔符,而不使用空格
  • -n 根据数值对数据进行排序

sort 示例

让我们看看 sort 的几个简单示例。

我们有一个 list.txt 的文件,包含逗号分隔的名称和数值。

首先让我们打印出文件内容并简单排序:

  1. $ cat list.txt 
  2. Cieran Wilks, 9 
  3. Adelina Rowland, 4 
  4. Hayden Mcfarlnd, 1 
  5. Ananya Lamb, 5 
  6. Shyam Head, 2 
  7. Lauryn Fuents, 8 
  8. Kristian Felix, 10 
  9. Ruden Dyer, 3 
  10. Greyson Meyers, 6 
  11. Luther Cooke, 7 
  12. $ sort list.txt 
  13. Adelina Rowland, 4 
  14. Ananya Lamb, 5 
  15. Cieran Wilks, 9 
  16. Greyson Meyers, 6 
  17. Hayden Mcfarlnd, 1 
  18. Kristian Felix, 10 
  19. Lauryn Fuents, 8 
  20. Luther Cooke, 7 
  21. Ruden Dyer, 3 
  22. Shyam Head, 2 

现在对数据进行倒序排序:

  1. $ sort -r list.txt 
  2. Shyam Head, 2 
  3. Ruden Dyer, 3 
  4. Luther Cooke, 7 
  5. Lauryn Fuents, 8 
  6. Kristian Felix, 10 
  7. Hayden Mcfarlnd, 1 
  8. Greyson Meyers, 6 
  9. Cieran Wilks, 9 
  10. Ananya Lamb, 5 
  11. Adelina Rowland, 4 

让我们打乱数据:

  1. $ sort -R list.txt 
  2. Cieran Wilks, 9 
  3. Greyson Meyers, 6 
  4. Adelina Rowland, 4 
  5. Kristian Felix, 10 
  6. Luther Cooke, 7 
  7. Ruden Dyer, 3 
  8. Lauryn Fuents, 8 
  9. Hayden Mcfarlnd, 1 
  10. Ananya Lamb, 5 
  11. Shyam Head, 2 

来看一点更复杂的。这次我们根据第二个字段,也就是数值对数据进行排序,并使用 -o 选项将输出保存到另一个文件中:

  1. $ sort -n -k2 -t ',' -o sorted_list.txt list.txt 
  2. $ ls 
  3.    sorted_list.txt    list.txt 
  4. $ cat sorted_list.txt 
  5. Hayden Mcfarlnd, 1 
  6. Shyam Head, 2 
  7. Ruden Dyer, 3 
  8. Adelina Rowland, 4 
  9. Ananya Lamb, 5 
  10. Greyson Meyers, 6 
  11. Luther Cooke, 7 
  12. Lauryn Fuents, 8 
  13. Cieran Wilks, 9 
  14. Kristian Felix, 10 

这里我们使用 -n 选项按数字顺序进行排序,-k 选项用来指定要排序的字段(在本例中为第 2 个字段),-t 选项指定分隔符或字段分隔符(逗号),-o 选项将输出保存到 sorted_list.txt 文件中。

3. sed

sed 是一个流编辑器,用于过滤和转换输出中的文本。这意味着我们不需要对原文件进行修改,只需要对输出进行修改。如果需要,我们可以将更改保存到一个新的文件中。sed 提供了很多有用的选项用于过滤和编辑数据。

sed 的语法格式如下:

  1. $ sed [OPTION] ‘PATTERN’ filename 

sed 常用的一些选项:

  • -n 取消默认输出
  • p 打印指定的数据
  • d 删除指定行
  • q 退出 sed 脚本

sed 示例

我们来看看 sed 是如何运作的。我们从 data 文件开始,其中的字段表示编号、名称、年龄和操作系统。

如果行出现在特定的行范围内,该行将打印 2 次:

  1. $ cat data 
  2. 1    Vicky Grant      20   linux 
  3. 2    Nora Burton    19   Mac 
  4. 3    Willis Castillo   21  Windows 
  5. 4    Gilberto Mack 30   Windows 
  6. 5    Aubrey Hayes  17   windows 
  7. 6    Allan Snyder    21   mac 
  8. 7    Freddie Dean   25   linux 
  9. 8    Ralph Martin    19   linux 
  10. 9    Mindy Howard  20   Mac 
  11. $ sed '3,7 p' data 
  12. 1    Vicky Grant      20   linux 
  13. 2    Nora Burton    19   Mac 
  14. 3    Willis Castillo   21  Windows 
  15. 3    Willis Castillo   21  Windows 
  16. 4    Gilberto Mack 30   Windows 
  17. 4    Gilberto Mack 30   Windows 
  18. 5    Aubrey Hayes  17   windows 
  19. 5    Aubrey Hayes  17   windows 
  20. 6    Allan Snyder    21   mac 
  21. 6    Allan Snyder    21   mac 
  22. 7    Freddie Dean   25   linux 
  23. 7    Freddie Dean   25   linux 
  24. 8    Ralph Martin    19   linux 
  25. 9    Mindy Howard 20   Mac 

这里的操作用单引号括起来,表示第 3 行和第 7 行,并且使用了 p 打印出符合匹配规则的数据。sed 的默认行为是在解析后打印每一行。这意味着由于使用了 p ,第 3 行到第 7 行打印了两次。

如何打印文件中特定的行?使用 -n 选项来消除在输出中不匹配的行:

  1. $ sed -n '3,7 p' data 
  2. 3    Willis Castillo     21    Windows 
  3. 4    Gilberto Mack    30   Windows 
  4. 5    Aubrey Hayes     17   windows 
  5. 6    Allan Snyder       21   mac 
  6. 7    Freddie Dean      25  linux 

使用 ‘-n’ 仅仅只有第 3 行到第 7 行会被打印。

省略文件中的特定行。使用 d 从输出中删除行:

  1. $ sed '3 d' data 
  2. 1    Vicky Grant      20    linux 
  3. 2   Nora Burton     19    Mac 
  4. 4   Gilberto Mack  30    Windows 
  5. 5   Aubrey Hayes   17    windows 
  6. 6   Allan Snyder     21    mac 
  7. 7   Freddie Dean    25   linux 
  8. 8   Ralph Martin    19    linux 
  9. 9   Mindy Howard  20   Mac 
  10. $ sed '5,9 d' data 
  11. 1    Vicky Grant     20   linux 
  12. 2   Nora Burton    19   Mac 
  13. 3   Willis Castillo   21   Windows 
  14. 4   Gilberto Mack 30   Windows 

从文件中搜索特定的关键字:

  1. $ sed -n '/linux/ p' data 
  2. 7    Freddie Dean   25  linux 
  3. 8    Ralph Martin   19   linux 
  4. $ sed -n '/linux/I p' data 
  5. 1     Vicky Grant      20  Linux 
  6. 7     Freddie Dean  25  linux 
  7. 8     Ralph Martin   19  linux 

在这些例子中,我们在 / / 中使用了一个正则表达式。如果文件中有类似的单词,但大小写不一致,可以使用 I 使得搜索不区分大小写。回想一下,-n 删除了输出中不匹配的行。

替换文件中的单词:

  1. $ sed 's/linux/linus/' data 
  2. 1   Vicky Grant      20   Linux 
  3. 2   Nora Burton    19   Mac 
  4. 3   Willis Castillo   21   Windows 
  5. 4   Gilberto Mack  30  Windows 
  6. 5   Aubrey Hayes   17  windows 
  7. 6   Allan Snyder     21  mac 
  8. 7   Freddie Dean    25 linus 
  9. 8   Ralph Martin    19  linus 
  10. 9   Mindy Howard 20  Mac 

这里 s/ / / 表示它是一个正则表达式。在两个 / 之间的就是定位的单词和需要替换的新单词。

4. tr

tr 命令可以用来转换或删除字符。它可以将小写字母转换为大写字母,也可以将大写字母转换为小写字母,可以消除重复字符,也可以删除特定字符。

tr 的奇怪之处在于,它不同于 wc、sort、sed 那样接受文件作为输入。我们使用 | (管道符)为 tr 命令提供输入。

  1. $ cat filename | tr [OPTION] 

tr 命令使用的一些选项:

  • -d 删除给定输入第一个集合中的指定字符,不做转换
  • -s 将重复出现的字符替换为单个

tr 示例

现在让我们使用 tr 命令将 letter 文件中的所有小写字符转换为大写字符:

  1. $ cat letter 
  2. Linux is too easy to learn, 
  3. And you should try it too. 
  4. $ cat letter | tr 'a-z' 'A-Z' 
  5. LINUX IS TOO EASY TO LEARN, 
  6. AND YOU SHOULD TRY IT TOO. 

这里的 a-z、A-Z 表示我们想要将 a 到 z 范围内的小写字符转换为大写字符。

删除文件中的 o 字符:

  1. $ cat letter | tr -d 'o' 
  2. Linux is t easy t learn, 
  3. And yu shuld try it t. 

从文件中压缩字符 o 意味着如果 o 在文件中重复出现,那么它将会被删除并且只打印一次:

  1. $ cat letter | tr -s 'o' 
  2. Linux is to easy to learn, 
  3. And you should try it to. 

总结

这是使用 wc、sort、sed、tr 命令的快速演示。这些命令可以方便快捷的操作终端上的文本文件。你可以使用 man 命令来了解这些命令的更多信息。

原文地址:https://linux.cn/article-13664-1.html