分享

熟悉 Shell脚本 - 基本文本处理

 lifebegins40s 2022-10-25 发布于北京

1 使用echo命令输出文本

1.1 显示转义字符

如果要使echo命令支持转义字符,还必须使用e选项。

文章图片1
文章图片2

在上面的代码中,第5行使用了退格符,该字符会使光标从当前位置向左后退一个字符,然后继续输出文本。因此,该字符会导致前面的一个字符被覆盖。第7行使用了\c字符,该字符会导致echo语句忽略hello后面的文本。第9行使用了换行符\n,该字符会使光标跳到下一行的开始位置。第11~13行使用制表符输出了一个简单的表格,该字符会使后面的内容在垂直方向上对齐。

该程序的执行结果如下:

文章图片3

1.2 显示命令执行结果

文章图片4
文章图片5
文章图片6

1.3 echo命令执行结果的重定向

简单地讲,重定向就是将Shell命令的标准输出重新定向到一个文件。在默认情况下,echo命令的标准输出设备为显示器。但是,在某些情况下,用户可能不需要将echo命令显示的信息输出到屏幕,而是需要将其保存到一个磁盘文件中,此时,用户就需要使用重定向。

重定向的操作符为>或者>>,在目标文件已经存在的情况下,前者会覆盖目标文件原有的内容,而后者则会将数据追加到原来文件的末尾。

文章图片7

2 文本的格式化输出

2.1 使用UNIX制表符

在Shell中,制表符通常使用转义字符\t表示,其中字母t表示Tab,即表格的英文单词Table的前3个字母。前面已经讲过,echo命令支持制表符的输出。但是为了使用转义字符,需要使用n选项。

文章图片8

关于for循环语句的使用方法,前面已经详细介绍过了。在本例中,使用双层for循环结构,依次以表格的形式输出两个循环中的循环变量的乘积。在第10行中,echo语句用来输出数据,最后附加了一个制表符,是为了纵向对齐每列。第13行的echo语句的作用是当内层循环每次结束之后,打印一个换行符。

该程序的执行结果如下:

文章图片9

2.2 使用fold命令格式化行

顾名思义,fold命令的功能是将超过指定宽度的文本行进行折叠处理,使得超过指定宽度的字符转到下一行输出。fold命令的基本语法如下:

文章图片10

在上面的语法中,options表示选项,fold命令常用的选项有如下所列。

  • b:按字节计算宽度。默认情况下,fold命令按列来计算宽度。
  • s:在空格处折断行。
  • w:指定宽度,默认值是80列。

file参数用来指定要输出的文件名,可以是多个文件,文件名之间用空格隔开。

例:通过s选项使文本行在换行时保留单词的完整,同样指定文本行的宽度为90列,命令如下:

文章图片11
文章图片12

通常情况下,用户使用fold命令的目的仅仅是输出到屏幕或者打印机等设备上面。如果想要将格式化的结果保存下来,可以使用重定向操作符将输出重定向到磁盘文件。

文章图片13

2.3 使用fmt命令格式化段落

与fold命令相比,fmt命令提供了更多的功能。fmt命令是Shell中的一个简单的文本格式化工具,其名称来自于格式化(format)的缩写。fmt命令的基本语法如下:

文章图片14

其中,width选项用来指定文本行的列数,默认为75列,即每行显示75个字符。option表示各种命令选项,常用的选项如下所列。

  • c:保留每个段落的前两行的缩进,该段落剩余的行的左边距与第2行相同。
  • t:该选的功能与c选项基本相同,但是在使用t选项时,每个段落的第1行和第2行的缩进必须是不相同的,否则第1行将被看做一个单独的段落。
  • s:只折断超出指定宽度的行,不合并少于指定宽度的行。
  • u:统一空格的个数,单词之间保留1个空格,句子之间保留2个空格。
  • w:指定每个行的最大宽度,默认值为75列。

file参数为要格式化其内容的文件名,可以同时指定多个文件,文件名之间用空格隔开。如果指定文件名为,则fmt命令会从标准输入,即键盘读取文本。

例1:使用w选项来指定行的最大长度为80列,代码如下:

文章图片15

以上代码的执行结果如下:

文章图片16

例2:如果不想fmt命令将不足指定行长度的行合并,则可以使用s选项。代码如下:

文章图片17

以上代码的执行结果如下:

文章图片18

2.4 使用rev命令反转字符顺序

rev命令的功能是用来反转文件中的文本行的字符顺序,其名称来自于reverse(反转)的前3个字母。rev命令的基本语法如下:

文章图片19

其中,file表示要处理的文件的文件名列表,如果是多个文件,则文件名之间用空格隔开。假设存在一个名称为demo3.txt的文本文件,其内容如下:

文章图片20

演示rev命令的使用方法,代码如下:

文章图片21

该例的执行结果如下:

文章图片22

2.5 使用pr命令格式化文本页

pr命令是一个非常有用的工具,其功能主要是将文本文件的内容转换成适合打印的格式。pr命令的名称来自于print(打印)的前两个字母,其基本语法如下:

文章图片23

其中,option表示命令选项,常用的选项如下所列。

  • -column:指定输出的栏数,默认值为1。
  • -a:修改column的显示效果,水平创建栏,与column选项配合使用。
  • -d:产生两个空格的输出。F或者f:使用换页符代替换行符实现分页。
  • -h:指定页眉,如果没有指定,则默认使用文件名作为页眉。
  • -l:指定每页的行数,默认为66行。
  • -o:指定每行的缩进的字符数量。
  • -w:指定页面宽度,默认为72个字符。

在使用column等选项时,一定要注意指定的不能超过页面的宽度。默认情况下,pr命令的分栏是垂直划分的,也就是说,文件的前面几行会作为第1栏的内容,接下来的几行会作为第2栏的内容,依此类推。但是用户可以使用a选项来改变这种显示的效果,使得水平划分栏。也就是说,文件的第1行作为第1栏的第1行,第2行作为第2栏的第1行,依此类推。当所有栏的第1行都输出之后,再重新回到第1栏输出第2行。

为了演示pr命令的使用方法,首先准备一个文件,其内容如下:

文章图片24

在上面的文件中,包含一个国家名称的列表。为了打印输出,用户需要使用pr命令来对该文件进行格式化处理。演示使用pr命令将该文件的内容进行格式化处理,代码如下:

文章图片25

其中,第5行将demo4.txt的内容分成4栏输出。页面宽度为默认值,即72个字符。

文章图片26

演示如何自定义页眉、文本水平分栏,以及使用换页符来代替换行符,代码如下:

文章图片27
文章图片28

除了以上常用选项之外,如果用户不想显示标题,则可以使用t选项,命令如下:

文章图片29
文章图片30

如果想要将格式化的结果保存到文件中,同样可以使用输出重定向操作符,如下所示。

文章图片31

3 使用sort命令对文本排序

sort命令的基本用法

文章图片32

在上面的语法中,option表示sort命令的选项,常用的选项如下所列。

  • -b:忽略前导空格或者制表符,找出第一个非空格字符。
  • -c:测试文件是否已经排序。
  • -d:根据字典顺序排序。该选项仅比较数字、字母和空格等字符。
  • -f:忽略大小写。将小写字母转成大写字母后参与比较。
  • -i:仅仅比较可打印字符。
  • -n:根据算术值进行比较,参与比较的字符有空格、十进制数字,以及减号等。如果对非数值字符进行算术值比较,将会产生无法预知的结果。
  • -R:根据哈希值随机排序。
  • -r:颠倒排序结果。
  • -k:定义排序关键字。
  • -m:仅仅合并已经排好序的文件,不执行排序操作。
  • -o:将排序结果写入文件,而不是标准输出设备。
  • -t:指定字段分隔符。默认值为空格。
  • -u:删除重复的行,只保留第一个。

file参数是要排序的文件列表,多个文件名之间用空格隔开。如果使用符号作为文件名,则从标准输入读取数据。

4 文本的统计

为了统计文本,Shell提供了许多有用的工具来完成文本的统计,例如wc、cat及grep等。

4.1 输出含有行号的文本行

在Shell中,有许多命令都可以输出行号,其中包括cat、grep及wc等。下面分别介绍如何使用这些命令输出行号。

cat命令提供了一个n选项,通过该选项,cat命令会在每一个文本行的前面添加一个行号,如下所示。

文章图片33

除了前面介绍的几个命令之外,Shell还提供了一个名称为nl的命令,用来为文本添加行号,其基本语法如下:

文章图片34

nl命令的常用选项如下所列。

  • -b:显示风格,可以取a、t及n等值,a表示为所有行添加行号,t表示仅仅为非空行添加行号,n表示不添加行号。
  • -i:行号的增量,默认值为1。
  • -v:行号的起始值,默认值为1。

参数file表示要添加行号的文件的列表。

演示使用nl命令为文本添加行号的方法,代码如下:

文章图片35
文章图片36

4.2 统计行数

在Shell程序中,用户可以使用grep及wc等命令来统计文本行的数量。下面分别介绍这两种统计文本行数的方法。

grep命令提供了一个名称为c的选项,用来统计符合筛选条件的文本行的行数。

wc命令是Shell中用来对文本进行各种统计的命令,其基本语法如下:

文章图片37

其中,wc命令常用的选项如下所列。

  • -c:统计文本的字节数。
  • -m:统计字符数。
  • -l:统计行数。
  • -L:统计最长行的长度。
  • -w:统计单词数。

与其他命令一样,wc命令可以接受多个文件名作为参数,这些文件名之间用空格隔开。

如果想要统计某个文件的行数,可以使用以下命令:

文章图片38

如果直接使用wcl命令统计文本的行数,会在输出行数的同时还包括被统计的文件的文件名。而在Shell程序,用户通常需要的仅仅是行数,介绍一个小技巧,那就是去掉wcl命令中的文件名,只得到行数。

文章图片39

在上面代码的第5行,首先使用cat命令显示文件的内容,然后通过管道将结果输出给wc–l命令,并且将得到结果赋给变量lines。

该程序的执行结果如下:

文章图片40

除了直接统计文本的行数之外,wc命令还有许多其他的用法,在下面的例子中,我们通过find命令和wc命令,来统计查找到的文件数。

例:使用find结合wc命令来统计/etc目录下面以.conf为扩展名的文件的数量,代码如下:

文章图片41

在上面的代码中,第5行首先使用find命令查找/etc目录下面以.conf为扩展名的文件列表。我们知道,在find命令的输出结果中,每一行都是一个文件名。然后通过管道将这个列表输出到wc命令中,通常wc命令统计出搜索结果列表的行数。

该程序的执行结果如下:

文章图片42

4.3 统计单词数和字符数

在许多语言中,例如英语,单词之间都是通过空格来隔开的。在wc命令中,也是通过空格来区分单词的。用户可以通过w选项来统计文本中的单词的数量。另外,通过m选项可以统计文本的字符数。

例:使用cat命令配合wc命令来取得文件中的单词的数量和字符数量,代码如下:

文章图片43
文章图片44

5 使用cut命令选取文本列

cut命令及基本语法

文章图片45

在上面的语法中,option表示选项,cut命令常用的选项如下所列。

  • -b:只选择指定的字节。
  • -c:只选择指定的字符。
  • -d:自定义列分隔符,默认值为制表符。
  • -f:只选择列表中指定的文本列,文本列用列号表示,多个列之间用逗号隔开。
  • -n:取消分隔多字节字符。
  • -s:不输出不包含列分隔符的行。

file参数表示要处理的文件列表,多个文件名之间用空格分隔。

6 使用paste命令拼接文本列

paste命令及其语法

文章图片46

其中,paste命令常用的选项如下所列。

  • -d:指定拼接结果中列分隔符。默认情况下paste命令生成的文件使用制表符分隔列。
  • -s:将多个文件串行地拼接在一起,即将后面文件的内容追加到前面一个文件的后面。

其中,s选项表示将各个文件依次连接在一起。也就是说,将后面一个文件的文本行追加在前面一个文件的内容的后面。因此,如果使用s选项,则生成的文件的列数与参与组合的文件的列数相同,但是行数等于参与组合的所有文件的行数之和。

file参数表示参与拼接的文件列表,文件名之间用空格隔开。如果省略文件名,则表示从标准输入接收文本数据。

7 使用join命令联接文本列

join命令及其语法

文章图片47

在上面的语法中,option表示join命令的相关选项,常用的选项如下所列。

-1 field:根据第1个文件的指定列进行联接。其中参数field用来指定第1个文件中用来联接的关键字列。

-2:field:根据第2个文件的指定列进行联接。其中参数field用来指定第2个文件中用来联接的关键字列。

-a filenum:指定是否输出不匹配的行。其中参数filenum可以取值为1或者2,分别代表参与联接的第1个文件和第2个文件。

-e string:使用参数string指定的字符串代替空列。

-i:在比较关键字时忽略大小写。

-o:自定义输出列。

-t:自定义列分隔符。

– v filenum:该选项的功能是输出filenum指定文件的所有的行。

在上面的选项中,其中a选项用来指定是否需要输出参与联接的两个文件中的不匹配的文本行,该选项可以取1或者2,当取值为1时,表示输出第1个文件中的所有的文本行,包括关键字不匹配的行;当取值为2时,表示输出第2个文件中的所有的文本行。该选项可以重复指定,例如想要同时输出两个文件中的所有的的行,可以指定-a1-a2。

8 使用tr命令替换文件内容

tr命令及其语法

文章图片48

在上面的语法中,option表示tr命令的选项,常用的选项如下所列。

  • -c:用字符集set2替换字符集set1中没有包含的字符。
  • -d:删除字符集set1中的所有字符,不执行替换操作。
  • -s:压缩set1中重复的字符。
  • -t:将字符集set1用set2转换。

参数set1和set2分别表示参与操作的两个字符集,其中set1用于查询,set2用于处理各种转换操作。也就是说,凡是在字符集set1中出现的字符,都将被替换为字符集set2中相应位置上的字符。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多