第六章 文件与目录
6.1 目录与路径
6.1.2 目录的相关操作
- cd:变换目录
- pwd:显示当前目录
- mkdir:建立一个新的目录
- rmdir:删除一个空的目录
cd
dmtsai 这个用户的家目录是/home/dmtsai/,而 root 家目录则是/root/,假设我以 root 身份在Linux 系统中,那么简单的说明一下这几个特殊的目录的意义是:
pwd
mkdir
rmdir
6.1.3 关于执行文件路径的变量: $PATH
echo $PATH 查看PATH配置
不同身份使用者预设的 PATH 不同,默认能够随意执行的指令也不同(如 root 与 dmtsai);
PATH 是可以修改的;
使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻 PATH 来的正确;
指令应该要放置到正确的目录下,执行才会比较方便;
本目录(.)最好不要放到 PATH 当中。
6.2 文件与目录管理
6.2.1 文件与目录的检视: ls
6.2.2 复制、删除与移动: cp, rm, mv
cp (复制文件或目录)
rm (移除文件或目录)
mv (移动文件与目录,或更名)
6.2.3 取得路径的文件名与目录名称
basename
dirname
6.3 文件内容查阅
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
- nl 显示的时候,顺道输出行号!
- more 一页一页的显示文件内容
- less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
- head 只看头几行
- tail 只看尾巴几行
- od 以二进制的方式读取文件内容!
6.3.1 直接检视文件内容
cat
tac (反向列示)
nl (添加行号打印)
6.3.2 可翻页检视
more (一页一页翻动)
在 more 这个程序的运作过程中,你有几个按键可以按的:
- 空格键 (space):代表向下翻一页;
- Enter :代表向下翻『一行』;
- /字符串 :代表在这个显示的内容当中,向下搜寻『字符串』这个关键词;
- :f :立刻显示出文件名以及目前显示的行数;
- q :代表立刻离开 more ,不再显示该文件内容。
- b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
比较有用的是搜寻字符串的功能,举例来说,我们使用『 more /etc/man_db.conf 』来观察该文件, 若想要在该文件内搜寻 MANPATH 这个字符串时,可以这样做:
less (一页一页翻动)
- 空格键 :向下翻动一页;
- [pagedown]:向下翻动一页;
- [pageup] :向上翻动一页;
- /字符串 :向下搜寻『字符串』的功能;
- ?字符串 :向上搜寻『字符串』的功能;
- n :重复前一个搜寻 (与 / 或 ? 有关!)
- N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
- g :前进到这个资料的第一行去;
- G :前进到这个数据的最后一行去 (注意大小写);
- q :离开 less 这个程序;
6.3.3 资料撷取
head (取出前面几行)
另外那个 -n 选项后面的参数较有趣,如果接的是负数,例如上面范例的-n -100 时,代表列前的所有行数, 但不包括后面 100 行。举例来说 CentOS 7.1 的 /etc/man_db.conf 共有 131 行,则上述的指令『head -n -100 /etc/man_db.conf』 就会列出前面 31 行,后面 100 行不会打印出来了。这样说,比较容易懂了吧?
tail (取出后面几行)
范例一的内容就有趣啦!其实与 head -n -xx 有异曲同工之妙。当下达『tail -n +100 /etc/man_db.conf』代表该文件从 100 行以后都会被列出来,同样的,在 man_db.conf 共有 131 行,因此第 100~131 行就会被列出来啦! 前面的 99 行都不会被显示出来喔!
6.3.4 非纯文本档: od
6.3.5 修改文件时间或建置新档: touch
看到了吗?在默认的情况下,ls 显示出来的是该文件的 mtime ,也就是这个文件的内容上次被更动的时间。 至于鸟哥的系统是在 5 月 4 号的时候安装的,因此,这个文件被产生导致状态被更动的时间就回溯到那个时间点了(ctime)! 而还记得刚刚我们使用的范例当中,有使用到 man_db.conf 这个文件啊,所以啊,他的 atime 就会变成刚刚使用的时间了!文件的时间是很重要的,因为,如果文件的时间误判的话,可能会造成某些程序无法顺利的运作。OK!那么万一我发现了一个文件来自未来,该如何让该文件的时间变成『现在』的时刻呢? 很简单啊!就用『touch』这个指令即可!
touch 这个指令最常被使用的情况是:
- 建立一个空的文件;
- 将某个文件日期修订为目前 (mtime 与 atime)
6.4 文件与目录的默认权限与隐藏权限
6.4.1 文件预设权限:umask
6.4.2 文件隐藏属性
chattr (配置文件案隐藏属性)
lsattr (显示文件隐藏属性)
6.4.3 文件特殊权限: SUID, SGID, SBIT
6.4.4 观察文件类型:file
如果你想要知道某个文件的基本数据,例如是属于 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的信息,就可以利用 file 这个指令来检阅
6.5 指令与文件的搜寻
6.5.1 脚本文件名的搜寻
which (寻找『执行档』)
6.5.2 文件档名的搜寻
whereis (由一些特定的目录中寻找文件文件名)
locate / updatedb
find
+4 代表大于等于 5 天前的檔名:ex> find /var -mtime +4
-4 代表小于等于 4 天内的文件档名:ex> find /var -mtime -4
4 则是代表 4-5 那一天的文件档名:ex> find /var -mtime 4
第七章、Linux 磁盘与文件系统管理
7.2 文件系统的简单操作
7.2.1 磁盘与目录的容量
df:列出文件系统的整体磁盘使用量;
du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
df
- Filesystem:代表该文件系统是在哪个 partition ,所以列出装置名称;
- 1k-blocks:说明底下的数字单位是 1KB 呦!可利用 -h 或 -m 来改变容量;
- Used:顾名思义,就是使用掉的磁盘空间啦!
- Available:也就是剩下的磁盘空间大小;
- Use%:就是磁盘的使用率啦!如果使用率高达 90% 以上时, 最好需要注意一下了,免得容量不足造成系统问题喔!(例如最容易被灌爆的 /var/spool/mail 这个放置邮件的磁盘)
- Mounted on:就是磁盘挂载的目录所在啦!(挂载点啦!)
du
7.3 磁盘的分区、格式化、检验与挂载
7.3.1 观察磁盘分区状态
lsblk 列出系统上的所有磁盘列表
lsblk 可以看成『 list block device 』的缩写,就是列出所有储存装置的意思!
- NAME:就是装置的文件名啰!会省略 /dev 等前导目录!
- MAJ:MIN:其实核心认识的装置都是透过这两个代码来熟悉的!分别是主要:次要装置代码!
- RM:是否为可卸除装置 (removable device),如光盘、USB 磁盘等等
- SIZE:当然就是容量啰!
- RO:是否为只读装置的意思
- TYPE:是磁盘 (disk)、分区槽 (partition) 还是只读存储器 (rom) 等输出
- MOUTPOINT:就是前一章谈到的挂载点!
第八章、文件与文件系统的压缩,打包与备份
8.2 Linux 系统常见的压缩指令
*.Z compress 程序压缩的文件;
*.zip zip 程序压缩的文件;
*.gz gzip 程序压缩的文件;
*.bz2 bzip2 程序压缩的文件;
*.xz xz 程序压缩的文件;
*.tar tar 程序打包的数据,并没有压缩过;
*.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
*.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩
*.tar.xz tar 程序打包的文件,其中并且经过 xz 的压缩
8.2.1 gzip, zcat/zmore/zless/zgrep
压缩services文件
gzip -v services
读取压缩文件
zcat services.gz
解压,并会删除原本的压缩文件
gzip -d services.gz
解压并保留压缩文件
-c 可以将原本要转成压缩文件的资料内容,将它变成文字类型从屏幕输出, 然后我们可以透过大于(>) 这个符号,将原本应该由屏幕输出的数据,转成输出到文件而不是屏幕,所以就能够建立出压缩挡了
gzip -c services > services.gz
从压缩文件中,找出http这个关键词在哪几行?
zgrep -n 'http' services.gz
当你使用 gzip 进行压缩时,在预设的状态下原本的文件会被压缩成为 .gz 的档名,源文件就不再存在了
8.2.2 bzip2, bzcat/bzmore/bzless/bzgrep
bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的。bzip2 真是很不错用的东西~这玩意的压缩比竟然比 gzip 还要好~至于bzip2 的用法几乎与 gzip 相同
8.2.3 xz, xzcat/xzmore/xzless/xzgrep
8.3 打包指令: tar
8.3.1 tar
- 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
- 查 询:tar -jtv -f filename.tar.bz2
- 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
那个 filename.tar.bz2 是我们自己取的档名,tar 并不会主动的产生建立的档名喔!我们要自定义啦!所以扩展名就显的很重要了!如果不加 [-z|-j-j|-J] 的话,档名最好取为 *.tar 即可。如果是 -j -j 选项,代表有 bzip2 的支持,因此档名最好就取为 *.tar.bz2 ,因为 bzip2 会产生 .bz2 的扩展名之故! 至于如果是加上了 -z 的 gzip 的支持,那档名最好取为 *.tar.gz
使用 tar 加入 -z, -j -j 或 -J 的参数备份 /etc/ 目录
time tar -zpcv -f /root/etc.tar.gz /etc
time tar -jpcv -f /root/etc.tar.bz2 /etc
time tar -Jpcv -f /root/etc.tar.xz /etc
time 会显示程序运作的时间
由于加上 -v 这个选项,因此正在作用中的文件名就会显示在屏幕上。
如果你可以翻到第一页,会发现出现上面的错误讯息!底下会讲解。
至于 -p 的选项,重点在于『保留原本文件的权限与属性』之意。
查阅 tar 文件的数据内容 (可察看檔名),与备份文件名有否根目录的意义
将备份的数据解压缩,并考虑特定目录的解压缩动作 (-C 选项的应用)
tar -jxv -f /root/etc.tar.bz2 -C /tmp
仅解开单一文件的方法
tar -jxv -f /root/etc.tar.bz2 etc/shadow -C /tmp
打包某目录,但不含该目录下的某些文件之作法
假设我们想要打包 /etc/ /root 这几个重要的目录,但却不想要打包 /root/etc* 开头的文件,因为该文件都是刚刚我们才建立的备份档嘛! 而且假设这个新的打包文件要放置成为 /root/system.tar.bz2 ,当然这个文件自己不要打包自己 (因为这个文件放置在 /root 底下啊!),此时我们可以透过 --exclude 的帮忙! 那个 exclude 就是不包含的意思!所以你可以这样做:
上面的指令是一整列的~其实你可以打成:『tar -j-jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root』,如果想要两行输入时,最后面加上反斜杠 () 并立刻按下[enter] , 就能够到第二行继续输入了。这个指令下达的方式我们会在第三章再仔细说明。 透过这个 --exclude=“file” 的动作,我们可以将几个特殊的文件或目录移除在打包之列,让打包的动作变的更简便
仅备份比某个时刻还要新的文件
某些情况下你会想要备份新的文件而已,并不想要备份旧文件!此时 --newer-mtime 这个选项就粉重要啦! 其实有两个选项啦,一个是『 --newer 』另一个就是『 --newer-mtime 』,这两个选项有何不同呢? 我们在第六章的 touch 介绍中谈到过三种不同的时间参数, 当使用 --newer 时,表示后续的日期包含『 mtime 与 ctime 』,而 --newer-mtime 则仅是 mtime 而已! 这样知道了吧! _ 。那就让我们来尝试处理一下
基本名称: tarfile, tarball ?
另外值得一提的是,tar 打包出来的文件有没有进行压缩所得到文件称呼不同喔!如果仅是打包而已,就是『 tar -cv -f file.tar 』而已,这个文件我们称呼为 tarfile 。如果还有进行压缩的支持,例如『 tar -j-jcv -f file.tar.bz2 』时,我们就称呼为 tarball (tar 球?)!这只是一个基本的称谓而已,不过很多书籍与网络都会使用到这个 tarball 的名称!所以得要跟您介绍介绍。
此外,tar 除了可以将资料打包成为文件之外,还能够将文件打包到某些特别的装置去,举例来说,磁带机 (tape) 就是一个常见的例子。磁带机由于是一次性读取/写入的装置,因此我们不能够使用类似cp 等指令来复制的! 那如果想要将 /home, /root, /etc 备份到磁带机 (/dev/st0) 时,就可以使用:『tar -cv -f /dev/st0 /home /root /etc』,很简单容易吧! 磁带机用在备份 (尤其是企业应用) 是很常见的工作喔!
特殊应用:利用管线命令与数据流
在 tar 的使用中,有一种方式最特殊,那就是透过标准输入输出的数据流重导向(standard input/standard output), 以及管线命令 (pipe) 的方式,将待处理的文件一边打包一边解压缩到目标目录去。
第九章、vim 程序编辑器
9.1 vi 与 vim
9.2.1 简易执行范例
1. 使用『 vi filename 』进入一般指令模式
2. 按下 i 进入编辑模式,开始编辑文字
3. 按下 [ESC] 按钮回到一般指令模式
4. 进入指令列模式,文件储存并离开 vi 环境
存档 (write) 并离开 (quit) 的指令很简单,输入『:wq』即可存档离开!
9.2.2 按键说明
第一部份:一般指令模式可用的按钮说明,光标移动、复制贴上、搜寻取代等
第二部份:一般指令模式切换到编辑模式的可用的按钮说明
第三部份:一般指令模式切换到指令列模式的可用按钮说明
9.3 vim 的额外功能
9.3.1 区块选择(Visual Block)
- 使用 vim hosts 来开启该文件,记得该文件请由上述的连结下载先!
- 将光标移动到第一列的 host 那个 h 上头,然后按下 [ctrl]-v ,左下角出现区块示意字样:
- 将光标移动到最底部,此时光标移动过的区域会反白!如下图所示:
- 此时你可以按下『 y 』来进行复制,当你按下 y 之后,反白的区块就会消失不见啰!
- 最后,将光标移动到第一列的最右边,并且再用编辑模式向右按两个空格键,回到一般指令模式后, 再按下『 p 』后,你会发现很有趣!如下图所示:
9.3.2 多文件编辑
- 透过『 vim hosts /etc/hosts 』指令来使用一个 vim 开启两个文件;
- 在 vim 中先使用『 :files 』察看一下编辑的文件数据有啥?结果如下所示。 至于下图的最后一列显示的是『按下任意键』就会回到 vim 的一般指令模式中!
- 在第一列输入『 4yy 』复制四列;
- 在 vim 的环境下输入『 :n 』会来到第二个编辑的文件,亦即 /etc/hosts 内;
- 在 /etc/hosts 下按『 G 』到最后一列,再输入『 p 』贴上;
- 按下多次的『 u 』来还原原本的文件数据;
- 最终按下『 :q 』来离开 vim 的多文件编辑吧!
9.3.3 多窗口功能
在指令列模式输入『:sp {filename}』即可!那个 filename 可有可无, 如果想要在新窗口启动另一个文件,就加入档名,否则仅输入 :sp 时, 出现的则是同一个文件在两个窗口间!让我们来测试一下,你先使用『 vim /etc/man_db.conf 』打开这个文件,然后『 1G 』去到第一列,之后输入『 :sp 』 再次的打开这个文件一次,然后再输入『 G 』,结果会变成底下这样喔:
万一你再输入『 :sp /etc/hosts 』时,就会变成下图这样喔:
9.3.4 vim 的挑字补全功能
假设你想要编写网页,正要使用到 CSS 的美化功能时,突然想到有个背景的东西要处理,但是突然忘记掉背景的 CSS 关键语法,那可以使用如下的模样来处置! 请注意,一定要使用 .html 或 .php 的扩展名,否则 vim 不会呼叫正确的语法检验功能喔!因此底下我们建立的档名为 html.html 啰!
由于网页通常会支持 CSS 的语法,而 CSS 的美化语法使用的是 style 这个关键词,这个关键词后面接的就是 CSS 的元素与元素值。 若想要取得可能的元素有哪些,例如背景 (background) 的语法中,想要了解有哪些跟它有关的内建元素,如上图, 直接输入 b 然后按下 [crtl]+x 再按下 [crtl]+o 就会出现如上的相关字词可以选择,此时你就能够使用上下按钮来挑选所需要的关键元素! 这样使用上当然方便很多啊!只是要注意,一定要使用正确的扩展名,否则会无法出现任何关键词词喔!
9.3.5 vim 环境设定与记录: ~/.vimrc, ~/.viminfo
9.3.6 vim 常用指令示意图
第十章、认识与学习 BASH
10.1 认识 BASH 这个 Shell
- /bin/sh (已经被 /bin/bash 所取代)
- /bin/bash (就是 Linux 预设的 shell)
- /bin/tcsh (整合 C Shell ,提供更多的功能)
- /bin/csh (已经被 /bin/tcsh 所取代)
Linux 预设就是使用 bash ,所以最初你只要学会 bash
10.1.4 Bash shell 的功能
命令编修能力 (history):
记忆使用过的指令
命令与文件补全功能: ([tab] 按键的好处)
- [Tab] 接在一串指令的第一个字的后面,则为命令补全;
- [Tab] 接在一串指令的第二个字以后时,则为『文件补齐』!
- 若安装 bash-completion 软件,则在某些指令后面使用 [tab] 按键时,可以进行『选项/参数的补齐』功能!
命令别名设定功能: (alias)
直接以 lm 这个自定义的命令来取代 ls -al 的命令,也就是说, lm 会等于 ls -al 这样的一个功能,嘿!那么要如何作呢?就使用 alias 即可!你可以在指令列输入 alias 就可以知道目前的命令别名有哪些了!也可以直接下达命令来设定别名呦:
- alias lm=‘ls -al’
工作控制、前景背景控制: (job control, foreground, background)
这部分我们在第十六章 Linux 过程控制中再提及
程序化脚本: (shell scripts)
通配符: (Wildcard)
10.1.5 查询指令是否为 Bash shell 的内建命令: type
10.1.6 指令的下达与快速编辑按钮
10.2 Shell 的变量功能
10.2.2 变量的取用与设定:echo, 变量设定规则, unset
变量的取用: echo
变量的取用就如同上面的范例,利用 echo 就能够读出,只是需要在变量名称前面加上 $ , 或者是以 ${变量} 的方式来取用都可以。
么我要如何『设定』或者是『修改』 某个变量的内容啊?很简单啦!用『等号(=)』连接变量与他的内容就好啦!举例来说: 我要将 myname 这个变量名称的内容设定为 VBird ,那么:
变量的设定规则
- 变量与变量内容以一个等号『=』来连结,如下所示:
『myname=VBird』 - 等号两边不能直接接空格符,如下所示为错误:
『myname = VBird』或『myname=VBird Tsai』 - 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
『2myname=VBird』 - 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
- 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
『var=“lang is $LANG”』则『echo $var』可得『lang is zh_TW.UTF-8』 - 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
『var=‘lang is $LANG’』则『echo $var』可得『lang is $LANG』
- 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
- 可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, , 空格符, '等)变成一般字符,如:『myname=VBird\ Tsai』
- 在一串指令的执行中,还需要藉由其他额外的指令所提供的信息时,可以使用反单引号『`指令`』或 『$(指令)』。特别注意,那个\ ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的设定:
『version=$(uname -r)』再『echo $version』可得『3.10.0-229.el7.x86_64』 - 若该变量为扩增变量内容时,则可用 “$变量名称” 或 ${变量} 累加内容,如下所示:『PATH=“$PATH”:/home/bin』或『PATH=${PATH}:/home/bin』
- 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量:『export PATH』
- 通常大写字符为系统默认变量,自行设定变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;
- 取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的设定:『unset myname』
10.2.3 环境变量的功能
用 env 观察环境变量与常见环境变量说明
用 set 观察所有变量 (含环境变量与自定义变量)
bash 可不只有环境变量喔,还有一些与 bash 操作接口有关的变量,以及用户自己定义的变量存在的。 那么这些变量如何观察呢?这个时候就得要使用 set 这个指令了。 set 除了环境变量之外, 还会将其他在 bash 内的变量通通显示出来
基本上,在 Linux 预设的情况中,使用{大写的字母}来设定的变量一般为系统内定需要的变量
export: 自定义变量转成环境变量
环境变量与自定义变量的差异:该变量是否会被子程序所继续引用
子程序仅会继承父程序的环境变量, 子程序不会继承父程序的自定义变量
10.2.4 影响显示结果的语系变量 (locale)
10.2.5 变量的有效范围
10.2.6 变量键盘读取、数组与宣告: read, array, declare
read
要读取来自键盘输入的变量,就是用 read 这个指令了。这个指令最常被用在 shell script 的撰写当中,想要跟使用者对谈?用这个指令就对了。关于 script 的写法,我们会在第十三章介绍
declare / typeset
declare 或 typeset 是一样的功能,就是在『宣告变量的类型』。如果使用 declare 后面并没有接任何参数,那么 bash 就会主动的将所有的变量名称与内容通通叫出来,就好像使用 set 一样
由于在默认的情况底下, bash 对于变量有几个基本的定义:
- 变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。 所以上述第一个执行的结果才会出现那个情况的;
- bash 环境中的数值运算,预设最多仅能到达整数形态,所以 1/3 结果是 0;
数组 (array) 变量类型
var[index]=content
意思是说,我有一个数组名为 var ,而这个数组的内容为 var[1]=小明,var[2]=大明,var[3]=好明 … 等等,那个 index 就是一些数字啦,重点是用中刮号 ([ ]) 来设定的。 目前我们 bash 提供的是一维数组。老实说,如果您不必写一些复杂的程序, 那么这个数组的地方,可以先略过,等到有需要再来学习即可!因为要制作出数组, 通常与循环或者其他判断式交互使用才有比较高的存在意义!
10.2.7 与文件系统及程序的限制关系: ulimit
10.2.8 变量内容的删除、取代与替换 (Optional)
变量内容的删除与取代
# 与 ##
非常有趣!不是吗?因为在 PATH 这个变量的内容中,每个目录都是以冒号『:』隔开的, 所以要从头删除掉目录就是介于斜线 (/) 到冒号 (😃 之间的数据!但是 PATH 中不止一个冒号 (😃 啊! 所以 # 与 ## 就分别代表:
- # : 符合取代文字的『最短的』那一个;
- ##:符合取代文字的『最长的』那一个
% 与 %%
/ 与 //
变量的测试与内容替换
- 与 +
= 与 :=
?
10.3 命令别名与历史命令
10.3.1 命令别名设定: alias, unalias
10.3.2 历史命令:history
那么 history 这个历史命令只可以让我查询命令而已吗?呵呵!当然不止啊! 我们可以利用相关的功能来帮我们执行命令呢!举例来说啰:
同一账号同时多次登入的 history 写入问题
无法记录时间
10.4 Bash Shell 的操作环境:
10.4.1 路径与指令搜寻顺序
10.4.2 bash 的进站与欢迎讯息: /etc/issue, /etc/motd
10.4.3 bash 的环境配置文件
login 与 non-login shell
/etc/profile (login shell 才会读)
~/.bash_profile (login shell 才会读)
source :读入环境配置文件的指令
~/.bashrc (non-login shell 会读)
10.4.4 终端机的环境设定: stty, set
stty
set
bash 默认的组合键
10.4.5 通配符与特殊符号
通配符
特殊符号
10.5 数据流重导向
数据流重导向就是将某个指令执行后应该要出现在屏幕上的数据, 给他传输到其他的地方
10.5.1 什么是数据流重导向
standard output 与 standard error output
standard output 与 standard error output 分别代表『标准输出 (STDOUT)』与『标准错误输出 (STDERR)』
< 或 << 或 > 或 >>
数据流重导向可以将 standard output (简称 stdout) 与 standard error output (简称 stderr) 分别传送到其他的文件或装置去,而分别传送所用的特殊字符则如下所示:
/dev/null 垃圾桶黑洞装置与特殊写法
/dev/null 可以吃掉任何导向这个装置的信息
2>&1 表示将 2> 转到 1> 去
standard input : < 与 <<
< 是将原本需要由键盘输入的数据,改由文件内容来取代
<< 代表的是 结束的输入字符
举例来讲:『我要用 cat 直接将输入的讯息输出到 catfile 中, 且当由键盘输入 eof 时,该次输入就结束』,那我可以这样做:
10.5.2 命令执行的判断依据: ; , &&, ||
cmd ; cmd (不考虑指令相关性的连续指令下达)
$? (指令回传值) 与 && 或 ||
上述的 cmd1 及 cmd2 都是指令。好了,回到我们刚刚假想的情况,就是想要: (1)先判断一个目录是否存在; (2)若存在才在该目录底下建立一个文件。由于我们尚未介绍如何判断式 (test) 的使用,在这里我们使用 ls 以及回传值来判断目录是否存在啦!
10.6 管线命令 (pipe)
管线命令『 | 』仅能处理经由前面一个指令传来的正确信息,也就是 standard output 的信息,对于stdandard error 并没有直接处理的能力。
10.6.1 撷取命令: cut, grep
cut
这个指令可以将一段讯息的某一段给他『切』出来~ 处理的讯息是以『行』为单位
cut 主要的用途在于将『同一行里面的数据进行分解!』最常使用在分析一些数据或文字数据的时候!这是因为有时候我们会以某些字符当作分区的参数,然后来将数据加以切割,以取得我们所需要的数据。 鸟哥也很常使用这个功能呢!尤其是在分析 log 文件的时候!不过,cut 在处理多空格相连的数据时,可能会比较吃力一点,所以某些时刻可能会使用下一章的 awk 来取代的!
grep
刚刚的 cut 是将一行讯息当中,取出某部分我们想要的,而 grep 则是分析一行讯息, 若当中有我们所需要的信息,就将该行拿出来~简单的语法是这样的:
10.6.2 排序命令: sort, wc, uniq
sort
sort 是很有趣的指令,他可以帮我们进行排序,而且可以依据不同的数据型态来排序喔! 例如数字与文字的排序就不一样。此外,排序的字符与语系的编码有关,因此, 如果您需要排序时,建议使用 LANG=C 来让语系统一,数据排序比较好一些。
uniq
这个指令用来将『重复的行删除掉只显示一个』,举个例子来说, 你要知道这个月份登入你主机的用户有谁,而不在乎他的登入次数,那么就使用上面的范例, (1)先将所有的数据列出;(2)再将人名独立出来;(3)经过排序;(4)只显示一个! 由于这个指令是在将重复的东西减少,所以当然需要『配合排序过的文件』来处理
wc
举个例子来说,当你要知道目前你的账号文件中有多少个账号时,就使用这个方法:『 cat /etc/passwd | wc -l 』啦!因为 /etc/passwd 里头一行代表一个使用者呀! 所以知道行数就晓得有多少的账号在里头了!而如果要计算一个文件里头有多少个字符时,就使用 wc -m 这个选项
10.6.3 双向重导向: tee
tee 可以让 standard output 转存一份到文件内并将同样的数据继续送到屏幕去处理! 这样除了可以让我们同时分析一份数据并记录下来之外,还可以作为处理一份数据的中间暂存盘记录之用
10.6.4 字符转换命令: tr, col, join, paste, expand
tr
tr 可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换
col
join
两个文件当中,有 “相同数据” 的那一行,才将他加在一起
paste
将两行贴在一起,且中间以 [tab] 键隔开
expand
这玩意儿就是在将 [tab] 按键转成空格键
unexpand 将空白转成 [tab] 的指令
10.6.5 分区命令: split
可以将大文件分区成为小文件
10.6.6 参数代换: xargs
产生某个指令的参数。xargs 可以读入 stdin 的数据,并且以空格符或断行字符作为分辨,将 stdin 的资料分隔成为 arguments。