第6章:基本操作文字档案介绍

前言

在上一章节中,介绍了该如何使用man这个指令来查询指定的指令的用法,在这一章节中,笔者将继续的介绍基本操作文字档案的方式以及相关的指令使用方法。

重新导向档案输出或是指令

在解释重新导向如何运作之前,可以搭配下面这张概念图:

Redirect image

从上面的图示可以知道,程序或是指令在执行的时候,会有三个管线,第一个就是使用者执行指令或是程序的时候,会有一个standard input的管线(stdin),这个就是当程序或是指令是互动式的时候,则会监控键盘所输入的字串,当程序或指令执行一阵子之後,会输出一些讯息,有些讯息是正常的资讯,那这些输出的讯息则会重新导向到stdout,就是standard output,标准输出的意思,而有些讯息会是在程序或是指令执行的时候出现错误讯息,这些错误的讯息则会导向到stderr之管线,即standard error,标准错误的意思,而编号0是stdin,编号1的即是stdout,编号2则是stderr。

知道管线上面会存放什麽讯息之後,接着就可以里用几个常用的指令来演示重新导向讯息的范例了。

重新导向输出档案范例

首先开启workstation虚拟机器,登入到rocky这个使用者之桌面环境之後,,笔者使用ls这个指令当作范例,并执行下列的指令:

[rockylinux@workstation ~]$ ls ~
Desktop    Downloads   file2_soft  ls.ps   Music     Public     Videos
Documents  file2_hard  ls.pdf      ls.txt  Pictures  Templates

ls~参数的话,指的是将家目录底下的档案与目录(不包含隐藏档案)列出,若是使用下列的指令:

[rockylinux@workstation ~]$ ls ~ > home_list.txt
[rockylinux@workstation ~]$ cat home_list.txt
Desktop
Documents
Downloads
file2_hard
file2_soft
home_list.txt
ls.pdf
ls.ps
ls.txt
Music
Pictures
Public
Templates
Videos

执行ls ~ > home_list.txt指令则是将输出的档案清单重新导向到home_list.txt这个档案中,接着可以使用cat这个指令将指定的档案内容给印出来到终端机上,就会得到上面的样子了。那>这是什麽?这指的是将stdin输出的讯息重新导向到home_list.txt档案里,也等价於ls 1> home_list.txt指令,所以当使用ls这个指令输出的讯息是在stderr时候,则导向的档案则会是空的,若只要将stderr之讯息存下来,那只要改成ls not_found_dir 2> error.txt即可,相关的执行命令之结果讯息如下:

[rockylinux@workstation ~]$ ls not_found_dir 2> error.txt
[rockylinux@workstation ~]$ cat error.txt
ls: cannot access 'not_found_dir': No such file or directory

那若要将stdout与stderr分别重新导向到个别的档案去储存,那可以使用下列的方式做到:

[rockylinux@workstation ~]$ ls not_found_dir 2> error.txt
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ cat error.txt
ls: cannot access 'not_found_dir': No such file or directory
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ ls not_found_dir 1> success.txt 2> error.txt
[rockylinux@workstation ~]$ cat success.txt
[rockylinux@workstation ~]$ cat error.txt
ls: cannot access 'not_found_dir': No such file or directory
[rockylinux@workstation ~]$ ls ~ 1> success.txt 2> error.txt
[rockylinux@workstation ~]$ cat success.txt
Desktop
Documents
Downloads
error.txt
file2_hard
file2_soft
home_list.txt
ls.pdf
ls.ps
ls.txt
Music
Pictures
Public
success.txt
Templates
Videos
[rockylinux@workstation ~]$ cat error.txt
[rockylinux@workstation ~]$

从上面的使用来看,就是分别将编号1之stdout与编号之stderr重新导向到success.txterror.txt档案储存,若要将上述两个管线都导向到同一个档案呢?那可以参考下列的做法:

[rockylinux@workstation ~]$ ls ~ > message.txt 2>&1
[rockylinux@workstation ~]$ cat message.txt
Desktop
Documents
Downloads
error.txt
file2_hard
file2_soft
home_list.txt
ls.pdf
ls.ps
ls.txt
message.txt
Music
Pictures
Public
success.txt
Templates
Videos
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ ls not_found_dir > message.txt 2>&1
[rockylinux@workstation ~]$ cat message.txt
ls: cannot access 'not_found_dir': No such file or directory

从上面的执行指令输出结果,可以知道两件事情:

  • 可以使用2>&1将stdout与stderr两个管线的输出讯息同时重新导向到message.txt做储存。
  • 可以注意到,使用>会将输出的讯息导向到指定的档案之外,也会将同一个档案之内容给覆盖掉,那要留下原本的文字档案要怎麽做呢?可以参考下列的做法:
[rockylinux@workstation ~]$ ls ~ > message.txt 2>&1
[rockylinux@workstation ~]$ ls not_found_dir >> message.txt 2>&1
[rockylinux@workstation ~]$ cat message.txt
Desktop
Documents
Downloads
error.txt
file2_hard
file2_soft
home_list.txt
ls.pdf
ls.ps
ls.txt
message.txt
Music
Pictures
Public
success.txt
Templates
Videos
ls: cannot access 'not_found_dir': No such file or directory

从上面的执行指令输出过程,可以看到,首先使用>方式先将message.txt档案内容覆盖成前家目录的清单讯息,接着将ls not_found_dir之错误讯息用>>之方式将内容从原本message.txt最後一行内容开始附加进去,这样就会完整保存之前所存放在message.txt档案之内容了。

Pipelines管线与tee指令用法介绍

讲完了重新导向以及标准输出与错误之重新导向到档案之後,接着来介绍另一个指令的功能,就是管线Pipelines了。这功能其实意思是,将前面的stdout输出的结果当成stdin输入并给下一个指定的指令,并两者用|隔开,那什麽意思呢?可以看一下下面的执行指令范例:

[rockylinux@workstation ~]$ ls ~ | tee home_list.txt
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos
[rockylinux@workstation ~]$ cat home_list.txt
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos

从上面执行指令的过程可以知道,首先先用ls ~将家目录除隐藏档案之外的档案与目录全数列出,接着使用pipelines管线将前面输出的档案与目录清单当成输入转给tee这个指令,这个指令是用来将读取标准输入讯息以及将读到的讯息写入到指定的档案中,因为使用tee指令的时候,会一并把写入的输入讯息给印出来,若不要将这些输入的讯息印出来的话,则可以将上述的指令改成:ls ~ | tee home_list.txt > /dev/null,意思就是将写入的讯息stdout之标准输出导向到没有,/dev/null是一个特别的装置档案,可以称为位元桶或是黑洞,导向这里的路径的讯息都会被吃掉与不见,因此就不会有输出的讯息了。

除了使用tee指令之外,另外也可以使用less或是more指令将用cat指令所书的指定档案内容终端的文字阅读器浏览,相关执行的指令方式如下:

[rockylinux@workstation ~]$ ls ~/ > home_list.txt
[rockylinux@workstation ~]$ cat home_list.txt | less
[rockylinux@workstation ~]$
Desktop
Documents
Downloads
home_list.txt
Music
Pictures
Public
Templates
Videos
(END)

从上面的指令执行後的输出讯息可以得知,首先先透过ls ~ > home_list.txt将家目录的清单给储存起来,接着使用cat指令将home_list.txt档案给印出并使用管线pipelines方式将前面档案内容当成输入并交给less指令,接着less便会开启一个文字阅读器让图取档案内容变得方便,进入文字阅读器之後,可以用键盘上与下方向键进行移动,要离开文字阅读器的话,按下键盘的Q即可以离开,若要搜寻的的话,则可以按下键盘的/之後,便可以输入要搜寻的关键字。

vim简易介绍与操作

vim,是一个功能强大且多元的终端机上的文字编辑器,透过使用键盘的方式便可以进行文字档案内容的编辑,为什麽要学vim呢?原因很简单,因为有时候,主机并不会有桌面环境,只有终端机的情况下,有需要编辑档案就无法使用图形化介面的文字编辑器,像是gedit等,因此学习vim会变得如此的重要原因就在这里。

要开启vim指令很简单,只要利用下面的方式即可以开启指定的档案:

[rockylinux@workstation ~]$ vim home_list.txt
[rockylinux@workstation ~]$

开启档案之後,就会进到文字编辑的模式,相关模式如下:

Desktop
Documents
Downloads
home_list.txt
Music
Pictures
Public
Templates
Videos
~
~
~
~
~
 "home_list.txt" 9L, 81C

相关的vim简易操作方式如下:

  • 按下键盘上的i键:在游标前方开始,插入字元。
  • 按下键盘上的a键:在游标後方插入字元。
  • 按下大写O键,在游标上方插空白行。
  • 按下键盘的o键:在游标下方插入空白行。
  • 按下键盘上的delete键:删除一个字元。
  • 连续按两下键盘的d键:删除一行。
  • 先按数字3接着按下键盘的d键:删除三行。
  • 连续按两下键盘y键:复制一行。
  • 按下键盘的p键:在游标下方贴上。
    -按下键盘的大写P键:在游标上方贴上。
  • 先按键盘上的数字3,接着按下y键:复制三行。
  • 先输入「:」键接着再输入数字1:移动游标到档案的第1行。
  • 先输入「:」键接着再输入数字N:移动游标到档案的第N行。
  • 先输入「:」键接着再输入$:移动到档案的最後一行。
  • 组合键:ctrl加上g键:显示游标在档案的行跟列的位置。
  • 按下键盘上的u键:回到之前的上一步。
  • 组合键ctrl加上r键:下一步。
  • 先按下「/」接着输入string,搜寻string这个字串。
  • 做完上述的搜寻动作之後,接着按下n键则向下搜寻指定的要搜寻的字串。
  • 做完上述的搜寻动作之後,接着按下大写N键则向上搜寻指定的要搜寻的字串。
  • 先输入「:」键接着再输入w:存档并继续编辑。
  • 先输入「:」键接着再输入wq:存档并结束编辑与离开vim。
  • 先输入「:」键接着再输入x:存档并结束编辑与离开vim。
  • 先输入「:」键接着再输入q!:不存档并结束编辑与离开vim。
  • 先输入「:」接着,输入「1,$ s/[Cc]at/Dog/g」:在档案内容中,从第1行道最後一行,以正规表示式搜寻并取代指定的字串。

有关於vim的用法还有很多,笔者这边先列出最常见的用法供读者们参考,日後更进阶的vim用法可以读者自行去翻阅其他书籍学习,但是笔者认为这些基本的vim用法学会之後,已经足以应付大部分的事情了。

课後练习

  • 请利用ls /home/rockylinux这个指令将输出的结果导向到home_rockylinux.txt档案中。
  • 请利用ls /home/rockylinux_not_found这个指令将输出的结果导向到home_rockylinux_not_found.txt档案中。
  • 请利用ls /home/rockylinux_not_found指令,不论是stdout或是stderr之结果都将要重新导向到message.txt档案中。
  • 请找出一个方法,不要将ls /home/rockylinux_not_found输出的讯息显示在终端机上。
  • 请使用cat message.txt指令并使用lessmore文字阅读器打开,请用一行指令完成。
  • 请使用vim指令进行文字编辑,并试着将message.txt之第一行与最後一行删除,并找到Documents字串将其改成Replaced-Documents

<<:  [Day 22] 资料产品在需求访谈阶段的五个大坑

>>:  [Day 23] placeholder

RESTful_API

RESTful_API只有听最後一堂 1.Lab_AJAX_Node.js localhost:80...

Android学习笔记16

因为如果把dialog写在viewmodel里面,之後在自动化测试的时候可能会出问题,所以在mvvm...

Stripe

前言 现在越来越多民众喜欢透过网路付款,在网路付款中很重要的环节就是需要进行线上刷卡,提到网路付款和...

在线传单制作工具介绍

让我们谈谈如何制作成功的商业传单进行促销。宣传传单的主要目的是吸引注意力。无论您是要开设商店还是想吸...

Python while回圈

我今天要来教大家Python的while回圈,前天有教过for回圈,都是能让程序重复跑的语法,但是功...