本篇博文介绍了Linux 下的一些常用指令,举了很多个范例去讲解每一种指令的用法,还对范例进行了分析。希望各位小伙伴不能只看,还要多加练习,自己将下面的范例完成一遍,才会有收获。博主相信,当你掌握了这篇博文的内容,就可以完全入门Linux 了。让我们开始学习/复习吧!!
功能描述:获得其他指令或者配置文件的帮助信息。
基本语法:man + [命令或配置文件]
举例:查看 ls 命令的帮助信息。命令如下:
[dmtsai@study ~]$ man ls
结果如下:
LS(1) General Commands Manual LS(1)
NAME
ls, dir, vdir - 列目录内容
提要
ls [选项] [文件名...]
POSIX 标准选项: [-CFRacdilqrtu1]
GNU 选项 (短格式):
[-1abcdfgiklmnopqrstuxABCDFGLNQRSUX] [-w cols] [-T cols] [-I pattern] [--full-time] [--format={long,verbose,commas,across,vertical,single-column}]
[--sort={none,time,size,extension}] [--time={atime,access,use,ctime,status}] [--color[={none,auto,always}]] [--help] [--version] [--]
描述( DESCRIPTION )
程序ls先列出非目录的文件项,然后是每一个目录中的“可显示”文件。如果没有选项之外的参数【译注:即文件名部分为空】出现,缺省为 "." (当前目录)。
选项“ -d ”使得目录与非目录项同样对待。除非“ -a ” 选项出现,文件名以“.”开始的文件不属“可显示”文件。
以当前目录为准,每一组文件(包括非目录文件项,以及每一内含文件的目录)分别按文件名比较顺序排序。如果“-l ”选项存在,每组文件前显示一摘要行:给出该组文件长度之和(以 512 字节为单位)。
输出是到标准输出( stdout )。除非以“ -C ”选项要求按多列输出,输出 将是一行一个。然而,输出到终端时,单列输出或多列输出是不确定的。可以分别用选项“ -1 ” 或“ -C ”来强制按单列或多列输出。
.....(后面省略).....
分析:man
指令可以获得其后接的命令/配置文件的帮助信息。
在上面我们获得了ls
指令的帮助信息,我们可以知道,在Linux 中,隐藏文件以.
开头,并且每个指令的多个选项可以组合使用,比如指令ls -al
,如下:
[dmtsai@study ~]$ ls -al
总用量 128
dr-xr-x---. 17 root root 4096 6月 6 12:19 .
dr-xr-xr-x. 19 root root 4096 4月 18 19:12 ..
-rw-------. 1 root root 16096 6月 5 15:49 .bash_history
-rw-r--r--. 1 root root 193 3月 31 09:49 .bash_profile
.....(后面省略).....
分析:使用 ls
指令时,将其-a
和 -l
选项组合使用,就可以将目录里面所有文件的详细信息按行输出了。
功能描述:获得 shell 内置命令的帮助信息。
基本语法:help + [命令]
举例:查看
history
命令的帮助信息。命令如下:
[dmtsai@study ~]$ help history
结果如下:
history: history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 参数 [参数...]
显示或操纵历史列表。
带行号显示历史列表,将每个被修改的条目加上前缀 '*'。
参数 N 会仅列出最后的 N 个条目。
选项:
-c 删除所有条目从而清空历史列表。
-d 偏移量 从指定位置删除历史列表。
-a 将当前绘画的历史行追加到历史文件中。
-n 从历史文件中读取所有未被读取的行。
-r 读取历史文件并将内容追加到历史列表中。
-w 将当前历史写入到历史文件中,并追加到历史列表中。
-p 对每一个 ARG 参数展开历史并显示结果,而不存储到历史列表中。
-s 以单条记录追加 ARG 到历史列表中。
.....(后面省略).....
分析:使用 help
指令可以显示其后接Linux内置命令(如cd,history
等)的帮助信息,对我们使用指令帮助巨大。
绝对路径: 由根目录/
开始写起的文件名或目录路径, 例如:/home/dmtsai/.bashrc
。
相对路径: 某个文件相对于当前文件的路径。 例如:./home/dmtsai
或../. ./home/dmtsai/
等等。反正开头不是/
就属于相对路径的写法。
相对路径是以“你当前文件所在路径的相对位置”来表示的。举例来说,假如你目前在
/home
这个目录下, 如果想要进入/var/log
这个目录时,可以怎么写呢?如下:
写法一: [dmtsai@study ~]$ cd /var/log #(absolute) 绝对路径
写法二: [dmtsai@study ~]$ cd ../var/log #(relative) 相对路径
解释:
cd (change directory)
,这是用来变换工作目录的指令,后面还会详细介绍。
目前在 /home
目录下面,所以要回到上一层目录 ../
之后,才能继续往 /var
目录移动。
特别注意这两个特殊的目录:
.
:代表当前目录,也可以使用 ./
来表示;
..
:代表上一层目录,也可以 ../
来代表。
这个.
与..
目录概念是很重要的,你常常会看到 cd ..
或./command
之类的指令下达方式。
例题:如何先进入
/var/spool/mail/
目录,再进入到/var/spool/cron/
目录内?
答:由于/var/spool/mail
与/var/spool/cron
同样在/var/spool/
目录中,因此最简单的指令下达方法为:
[dmtsai@study ~]$ cd /var/spool/mail
[dmtsai@study ~]$ cd ../cron
相对路径的用途:
/cluster/raid/output/taiwan2006/smoke
这个目录下工作,而另一个目录在 /cluster/raid/output/taiwan2006/cctm
路径下,那么从第一个要到第二个目录去的话,怎么写比较方便?当然是使用cd . ./cctm
了。绝对路径的用途:
有一些比较特殊的目录需要记下来才行,如下表:
目录 | 代表含义 |
---|---|
. |
代表的当前目录 |
.. |
代表上一层目录 |
- |
代表用户所在的上一个目录 |
~ |
代表“目前使用者身份”所在的主文件夹 |
~account |
代表 account 这个使用者的主文件夹(account是个帐号名称) |
[dmtsai@study ~]$ su - # 先切换身份成为 root。
[root@study ~] cd [相对路径或绝对路径]
# 最重要的就是目录的绝对路径与相对路径,还有一些特殊目录的符号。
[root@study ~] cd ~dmtsai
# 代表去到 dmtsai 这个使用者的主文件夹,亦即 /home/dmtsai
[root@study dmtsai] cd ~
# 表示回到自己的主文件夹,亦即是 /root 这个目录;
[root@study ~] cd
# 没有加上任何路径,也还是代表回到自己主文件夹的意思;
[root@study ~] cd ..
# 表示去到目前的上层目录,亦即是 /root 的上层目录即根目录(/)的意思;
[root@study /] cd -
# 表示回到刚刚的那个目录,也就是 /root
[root@study ~] cd /var/spool/mail
# 这个就是绝对路径的写法!直接指定要去的完整路径名称;
[root@study mail] cd ../postfix
# 这个是相对路径的写法,我们由/var/spool/mail
# 去到/var/spool/postfix 就这样写。
[root@study ~] pwd [-P]
选项与参数:
-P :显示出正确的路径,而非使用链接 (link) 路径。
范例:单纯显示出目前的工作目录:
[root@study ~] pwd
/root # 显示出目前的工作目录
范例:显示出实际的工作目录,而非链接文件本身的目录名而已
[root@study ~] cd /var/mail
#注意,/var/mail是一个链接文件
[root@study mail] pwd
/var/mail #列出目前的工作目录
[root@study mail] pwd -P
/var/spool/mail #加了选项 -P 后出现不同
[root@study mail] ls -ld /var/mail
lrwxrwxrwx. 1 root root 10 May 4 17:51 /var/mail -> spool/mail
# 因为 /var/mail 是链接文件,链接到 /var/spool/mail 文件上,
# 所以,加上 pwd -P 的选项后,输出不以链接文件的数据显示,而是显示正确的完整路径。
[root@study ~] mkdir [-mp] 目录名称
选项与参数:
-m :设置文件的权限。直接设置,不需要默认权限 (umask) 。
-p :帮助你直接将所需要的目录(包含上层目录)递回创建起来。
范例:请到/tmp下面尝试创建数个新目录看看:
[root@study ~] cd /tmp
[root@study tmp] mkdir test #创建一名为 test 的新目录,成功。
[root@study tmp] mkdir test1/test2/test3/test4
# 我想直接创建多层目录,会失败,系统返回:
mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory
# 系统返回,不能创建这个目录。
[root@study tmp] mkdir -p test1/test2/test3/test4
# 原来要创建 test4 前需要先创建 test3 。加了这个 -p 的选项,系统可以自行递归创建多层目录,不需要再一层一层创建。
范例:创建权限为rwx--x--x的目录
[root@study tmp] mkdir -m 711 test2
[root@study tmp] ls -ld test*
drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
# 仔细看上面的权限部分,如果没有加上 -m 来强制设置属性,系统会使用默认属性。 如果看不懂默认权限的小伙伴可以忽略本例,我们会在其他章节介绍文件权限的内容。
[root@study ~] rmdir [-p] 目录名称
选项与参数:
-p :连同“上层”“空的”目录也一起删除
范例:将于mkdir范例中创建的目录(/tmp下面)删除掉
[root@study tmp] ls -ld test* # 看看有多少目录存在?
drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
[root@study tmp] rmdir test # 可直接删除掉最末尾的目录,没问题。
[root@study tmp] rmdir test1
# 因为test1 目录下尚有内容,所以无法删除!系统返回:
rmdir: failed to remove ‘test1’: Directory not empty
[root@study tmp] rmdir -p test1/test2/test3/test4
[root@study tmp] ls -ld test*
# 下面的输出中test与test1不见了。
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
# 利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除;
# 不过要注意的是,这个 rmdir 仅能“删除空的目录”。
[root@study ~] ls [-aAdfFhilnrRSt] 文件名或目录名称..
[root@study ~] ls [--color={never,auto,always}] 文件名或目录名称..
[root@study ~] ls [--full-time] 文件名或目录名称..
选项与参数:
-a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
-A :全部的文件,连同隐藏文件,但不包括 . 与 .. 这两个目录
-d :仅列出目录本身,而不是列出目录内的文件数据(常用)
-f :直接列出结果,而不进行排序 (ls 默认会以文件名排序!)
-F :根据文件、目录等信息,给予附加数据结构,例如: *:代表可可执行文件;
/:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
-h :将文件大小以人类较易读的方式(例如 GB, KB 等等)列出来;
-i :列出 inode 号码,inode 的意义下一章将会介绍;
-l :长数据串行出,包含文件的属性与权限等等数据;(常用)
-n :列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在帐号管理提到!)
-r :将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小;
-R :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来;
-S :以文件大小大小排序,而不是用文件名排序;
-t :依时间排序,而不是用文件名。
[root@study ~] cp [-adfilprsu] 来源文件(source) 目标文件(destination)
[root@study ~] cp [options] source1 source2 source3 .... directory
选项与参数:
-a :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(常用)
-d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身;
-f :为强制(force)的意思,若目标文件已经存在且无法打开,则移除后再尝试一次;
-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l :进行硬式链接(hard link)的链接文件创建,而非复制文件本身;
-p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
-r :递回持续复制,用于目录的复制行为;(常用)
-s :复制成为符号链接文件 (symbolic link),亦即“捷径”文件;
-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。
最后需要注意的,如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行!
[root@study ~] cp ~/.bashrc /tmp/bashrc
[root@study ~] cp -i ~/.bashrc /tmp/bashrc
cp: overwrite '/tmp/bashrc'? n # n不覆盖,y为覆盖
# 重复作两次动作,由于 /tmp 下面已经存在 bashrc 了,加上 -i 选项后,
# 则在覆盖前会询问使用者是否确定。可以按下 n 或者 y 来二次确认。
范例二:变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性:
[root@study ~] cd /tmp
[root@study tmp] cp /var/log/wtmp .
# 想要复制到目前的目录,最后的( . )不要忘;
[root@study tmp] ls -l /var/log/wtmp wtmp
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-r--r--. 1 root root 28416 Jun 11 19:01 wtmp
# 注意上面的特殊字体,在不加任何选项的情况下,文件的某些属性/权限会改变;
# 这是个很重要的特性!要注意喔!还有,连文件创建的时间也不一样了!
# 那如果你想要将文件的所有特性都一起复制过来该怎办?可以加上 -a 选项。
如下所示:
[root@study tmp] cp -a /var/log/wtmp wtmp_2
[root@study tmp] ls -l /var/log/wtmp wtmp_2
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 wtmp_2
# 如上,整个数据特性完全一模一样。这就是 -a 的特性。
范例三:复制 /etc/ 这个目录下的所有内容到 /tmp 下面
[root@study tmp] cp /etc/ /tmp
# 如果是目录则不能直接复制,系统输出:
cp: omitting directory '/etc'
[root@study tmp] cp -r /etc/ /tmp # 使用-r选项递归复制
# 还是要再次的强调, -r 是可以递归复制目录及其下面的所有文件,但是,文件与目录的权限可能会被改变;
# 所以,也可以利用“ cp -a /etc /tmp ”来下达指令,尤其是在备份的情况下。
范例四:若 ~/.bashrc 文件的内容比 /tmp/bashrc 文件的内容新才复制。
[root@study tmp] cp -u ~/.bashrc /tmp/bashrc
# 这个 -u 的特性,是在目标文件与来源文件有差异时,才会复制。
# 所以,比较常被用于“备份”的工作当中
范例五:将主文件夹的 .bashrc 及 .bash_history 文件复制到 /tmp 目录下面
[root@study tmp] cp ~/.bashrc ~/.bash_history /tmp
# 可以将多个数据一次复制到同一个目录去,最后面一定是目录。
例题:你能否使用 dmtsai 的身份,完整的复制/var/log/wtmp文件到/tmp下面,并更名为 dmtsai_wtmp呢?答:实际做看看的结果如下:
[dmtsai@study ~]$ cp -a /var/log/wtmp /tmp/dmtsai_wtmp
[dmtsai@study ~]$ ls -l /var/log/wtmp /tmp/dmtsai_wtmp
-rw-rw-r--. 1 dmtsai dmtsai 28416 6月 11 18:56 /tmp/dmtsai_wtmp
-rw-rw-r--. 1 root utmp 28416 6月 11 18:56 /var/log/wtmp
[root@study ~] rm [-fir] 文件或目录
选项与参数:
-f :就是强制的意思,忽略不存在的文件,不会出现警告讯息;
-i :互动模式,在删除前会询问使用者是否动作 ;
-r :递归删除,最常用在目录的删除了,这是非常危险的选项!!!
范例一:将刚刚在 cp 的范例中创建的 bashrc 删除掉!
[root@study ~] cd /tmp
[root@study tmp] rm -i bashrc
rm: remove regular file 'bashrc'? y
# 如果加上 -i 的选项就会主动询问,避免你删除到错误的文件名!
范例二:通过万用字符*的帮忙,将/tmp下面开头为bashrc的文件名通通删除:
[root@study tmp] rm -i bashrc*
# 注意那个星号,代表的是 0 到无穷多个任意字符。
范例三:将 cp 范例中所创建的 /tmp/etc/ 这个目录删除掉!
[root@study tmp] rmdir /tmp/etc
rmdir: failed to remove '/tmp/etc': Directory not empty
# 删不掉,因为这不是空的目录,必须要加上-r 选项。
[root@study tmp] rm -r /tmp/etc
rm: descend into directory '/tmp/etc'? y
rm: remove regular file '/tmp/etc/fstab'? y
rm: remove regular empty file '/tmp/etc/crypttab'? ^C
# 按下 [crtl]+c 中断
.....(中间省略).....
# 因为用户身份是 root ,默认已经加入了 -i 的选项,所以你要一直按 y 才会删除!
# 如果不想要继续按 y ,可以按下“ [ctrl]-c ”来结束 rm 的工作。
# 这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做:
[root@study tmp] rm -rf /tmp/etc
# 使用-f 选项可以忽略提示信息;
# 这个范例很可怕!你不要删错了!删除 /etc 目录系统是会挂掉的!
范例四:删除一个带有 - 开头的文件
[root@study tmp] touch ./-aaa-
# [touch](../Text/index.html#touch)这个指令可以创建一个空文件。
[root@study tmp] ls -l
-rw-r--r--. 1 root root 0 Jun 11 19:22 -aaa-
# 文件大小为0,所以是空文件。
[root@study tmp] rm -aaa-
rm: invalid option -- 'a' # 因为 "-" 是选项嘛!所以系统误判了!
Try 'rm ./-aaa-' to remove the file '-aaa-'.
# 新的 bash 会给出建议;
Try 'rm --help' for more information.
[root@study tmp] rm ./-aaa-
# 要想删除只能选择避过首位字符是 "-" 的方法,加上本目录“ ./ ”即可
[root@study ~] mv [-fiu] source destination
[root@study ~] mv [options] source1 source2 source3 ...directory
选项与参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖;
-u :若目标文件已经存在,且 source 比较新,才会更新 (update)。
范例一:复制一文件,创建一目录,将文件移动到目录中
[root@study ~] cd /tmp
[root@study tmp] cp ~/.bashrc bashrc
[root@study tmp] mkdir mvtest
[root@study tmp] mv bashrc mvtest
# 将某个文件移动到某个目录去,就是这样做。
范例二:将刚刚的目录名称更名为 mvtest2
[root@study tmp] mv mvtest mvtest2
# 当目的目录不存在时,使用mv 是将源目录更名的意思。
# 其实在 Linux 下面还有个有趣的指令,名称为 rename ,
# 该指令专职进行多个文件名的同时更名,并非针对单一文件名变更,与mv不同。请man rename。
范例三:再创建两个文件,再全部移动到 /tmp/mvtest2 当中
[root@study tmp] cp ~/.bashrc bashrc1
[root@study tmp] cp ~/.bashrc bashrc2
[root@study tmp] mv bashrc1 bashrc2 mvtest2
# 注意,如果有多个来源文件或目录,则最后一个目标文件一定是“目录!”
# 意思是说,将所有的数据移动到该目录的意思。
[root@study ~] cat [-AbEnTv]
选项与参数:
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符
范例一:检阅 /etc/issue 这个文件的内容
[root@study ~] cat /etc/issue
\S
Kernel \r on an \m
范例二:承上题,如果还要加印行号呢?
[root@study ~] cat -n /etc/issue
1 \S
2 Kernel \r on an \m
3
# 所以这个文件有三行!可以印出行号,这对于大文件要找某个特定的行时有点用处 。
# 如果不想要编排空白行的行号,可以使用“cat -b /etc/issue”。
[root@study ~] tac /etc/issue
Kernel \r on an \m
\S
# 与刚刚上面的范例一比较,是由最后一行先显示的。
[root@study ~] more /etc/man_db.conf
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
#
.....(中间省略).....
--More--(28%) # 重点在这一行,你的光标会在这里等待你的指令。
按键 | 功能 |
---|---|
空白键 (space) | 代表向下翻一页 |
Enter | 代表向下翻“一行” |
/字串 | 代表在这个显示的内容当中,向下搜寻“字串”这个关键字 |
:f | 立刻显示出文件名以及目前显示的行数 |
q | 代表立刻离开 more ,不再显示该文件内容 |
b 或 [ctrl]-b | 代表往回翻页,不过这动作只对文件有用,对管线无用 |
[root@study ~] more /etc/man_db.conf
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining # their PATH environment variable. For details see the manpath(5) man page.
#
....(中间省略)....
/MANPATH # 输入了 / 之后,光标就会自动跑到最下面一行等待输入。
[root@study ~] less /etc/man_db.conf
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
#
.....(中间省略).....
: # 重点在这一行,你的光标会在这里等待你的指令。
按键 | 功能 |
---|---|
空白键 | 向下翻动一页 |
[pagedown] | 向下翻动一页 |
[pageup] | 向上翻动一页 |
/字串 | 向下搜寻“字串”的功能 |
?字串 | 向上搜寻“字串”的功能 |
n | 重复前一个搜寻 (与 / 或 ? 有关!) |
N | 反向的重复前一个搜寻 (与 / 或 ? 有关!) |
g | 前进到这个数据的第一行去 |
G | 前进到这个数据的最后一行去 (注意大小写) |
q | 离开 less 这个程序 |
[root@study ~] head [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思
[root@study ~] head /etc/man_db.conf
# 默认的情况中,显示前面十行!若要显示前 20 行,就得要这样:
[root@study ~] head -n 20 /etc/man_db.conf
范例:如果后面100行的数据都不打印,只打印/etc/man_db.conf的前面几行,该如何是好?
[root@study ~] head -n -100 /etc/man_db.conf
[root@study ~] tail [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测
[root@study ~] tail /etc/man_db.conf
# 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:
[root@study ~] tail -n 20 /etc/man_db.conf
范例一:如果不知道/etc/man_db.conf有几行,却只想列出100行以后的数据时?
[root@study ~] tail -n +100 /etc/man_db.conf
范例二:持续侦测 /var/log/messages 的内容
[root@study ~] tail -f /var/log/messages
# 要等到输入 [crtl]-c 之后才会离开tail 这个指令的侦测。
例题:假如我想要显示 /etc/man_db.conf 的第 11 到第 20 行呢?
- 答:第 11 到第 20 行,那么取前 20 行,再取后十行,所以结果就是:
“ head -n 20 /etc/man_db.conf | tail -n 10 ”
这样就可以得到第 11 到第 20 行之间的内容了。
[root@study ~] touch 文件名
范例一:在/tmp目录下新建一个空的文件testtouch
[dmtsai@study ~] cd /tmp ; touch testtouch
# 进入/tmp目录,创建一个新文件;然后使用ls 指令就可以看到新建的文件了。
[dmtsai@study tmp] ls -l testtouch
-rw-rw-r--. 1 dmtsai dmtsai 0 Jun 16 00:45 testtouch
[root@study ~] file ~/.bashrc
/root/.bashrc: ASCII text # 告诉我们是 ASCII 的纯文本文件啊!
[root@study ~] file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=0xbf35571e607e317bf107b9bcf65199988d0ed5ab, stripped
# 可执行文件的数据可就多的不得了!包括这个文件的 suid 权限、相容于 Intel x86-64 等级的硬件平台
# 使用的是 Linux 核心 2.6.32 的动态函数库链接等等。
[root@study ~] file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data
# 这是 data 文件!
[root@study ~] which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称 。
范例一:搜寻 ifconfig 这个指令的完整文件名
[root@study ~] which ifconfig /sbin/ifconfig
范例二:用 which 去找出 which 的文件名为何?
[root@study ~] which which
alias which='alias | /usr/bin/which --tty-only --read-alias -show-dot --show-tilde'
/bin/alias
/usr/bin/which
# 竟然会有两个 which ,其中一个是 alias 。
# 那就是所谓的“命令别名”,意思是输入 which 会等于后面接的那串指令啦!
# 更多的数据我们会在 bash 章节中再来讨论的。
范例三:请找出 history 这个指令的完整文件名
[root@study ~] which history
/usr/bin/which: no history in(/usr/local/sbin:/usr/local/bin:/sbin:/bin: /usr/sbin:/usr/bin:/root/bin)
[root@study ~] history --help
-bash: history: --: invalid option
history: usage: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg
# 系统显示无 history指令 ,但我明明可以用 root 执行 history 指令的。
[root@study ~] whereis [-bmsu] 文件或目录名
选项与参数:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文档 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件
范例一:请找出 ifconfig 这个文件名
[root@study ~] whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
范例二:只找出跟 passwd 有关的“说明文档”文件名(man page)
[root@study ~] whereis passwd # 全部的文件名通通列出来!
passwd:/usr/bin/passwd/etc/passwd
/usr/share/man/man1/passwd.1.gz
/usr/share/man/man5/passwd.5.gz
[root@study ~] whereis -m passwd
# 只有在 man 里面的文件名才抓出来!
passwd:/usr/share/man/man1/passwd.1.gz
/usr/share/man/man5/passwd.5.gz
[root@study ~] locate [-ir] keyword
选项与参数:
-i :忽略大小写的差异;
-c :不输出文件名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正则表达式的显示方式
范例一:找出系统中所有与 passwd 相关的文件名,且只列出 5 个。
[root@study ~] locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
范例二:列出 locate 查询所使用的数据库文件之文件名与各数据数量。
[root@study ~] locate -S Database
/var/lib/mlocate/mlocate.db:
8,086 directories # 总纪录目录数
109,605 files # 总纪录文件数
5,190,295 Bytes in file names
2,349,150 Bytes used to store database
[root@study ~] find 目录 [option]
选项与参数:
-name filename:搜寻文件名称为 filename 的文件。
-user name :搜寻属于指定使用者的所有文件, name 为使用者帐号名称,例如 dmtsai。
-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。
这个 SIZE 的规格有: c: 代表 Byte,
k: 代表 1024Bytes。
所以,要找比 50KB 还要大的文件,就是“ -size +50k ”。
-type TYPE :搜寻文件的类型为 TYPE 的,类型主要有:
一般正规文件 (f), 设备文件 (b, c),
目录 (d), 链接文件 (l),
socket (s), 及 FIFO (p) 等属性。
范例一:找出文件名为 passwd 这个文件。
[root@study ~] find / -name passwd
# 注意不要忽略 / ,这是根目录的意思。
范例二:找出文件名包含了 passwd 这个关键字的文件。
[root@study ~] find / -name "*passwd*"
# 利用这个 -name 可以搜寻文件名,默认是完整文件名,如果想要找关键字,
# 可以使用通配字符( * )的任意字符来处理。
范例三:找出 /run 目录下,文件类型为 Socket 的文件名有哪些。
[root@study ~] find /run -type s
# 这个 -type 的属性也很有帮助,
# 例如 socket 与 FIFO 文件,可以用 find /run -type p 或 -type s 来搜寻。
范例四:搜寻 /home 下面属于 dmtsai 的文件。
[root@study ~] find /home -user dmtsai
# 当我们要找出任何一个使用者在系统当中的所有文件时,
# 就可以利用这个指令将属于某个使用者的所有文件都找出来。
[dmtsai@study ~]$ gzip [-cdtv#] 文件名
[dmtsai@study ~]$ zcat 文件名.gz
选项与参数:
-c :将压缩的数据输出到屏幕上,可通过数据流重导向来处理;
-d :解压缩时使用的参数;
-t :可以用来检验一个压缩文件的一致性,看看文件有无错误;
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
范例一:找出 /etc 下面 (不含子目录) 容量最大的文件,并将它复制到 /tmp ,然后以 gzip 压缩。
[dmtsai@study ~]$ ls -ldSr /etc/*
# 忘记选项意义?请自行 man。
.....(前面省略).....
-rw-r--r--. 1 root root 25213 Jun 10 2014 /etc/dnsmasq.conf
-rw-r--r--. 1 root root 69768 May 4 17:55 /etc/ld.so.cache
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
[dmtsai@study ~]$ cd /tmp
[dmtsai@study tmp]$ cp /etc/services . # 注意最后有个(.)代表目的目录
[dmtsai@study tmp]$ gzip -v services
services: 79.7% -- replaced with services.gz
[dmtsai@study tmp]$ ll /etc/services /tmp/services*
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
-rw-r--r--. 1 dmtsai dmtsai 136088 Jun 30 18:40 /tmp/services.gz
# 显而易见,被压缩后的文件占用空间少了很多。
范例二:由于 services 是文本文件,请将范例一的压缩文件的内容读出来!
[dmtsai@study tmp]$ zcat services.gz
# 由于 services 这个原本的文件是是文本文件,因此我们可以尝试使用 zcat/zmore/zless 指令去读取!
# 此时屏幕上会显示 servcies.gz 解压缩之后的原始文件内容!
范例三:将范例一的文件解压缩。
[dmtsai@study tmp]$ gzip -d services.gz
# 不要使用 gunzip 这个指令解压缩,不好背!直接使用 gzip -d 来进行解压缩!
# 与 gzip 相反, gzip -d 会将原本的 .gz 删除,回复到原本的 services 文件。
范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件。
[dmtsai@study tmp]$ gzip -9 -c services > services.gz
范例五:由范例四再次创建的 services.gz 中,找出 http 这个关键字在哪几行?
[dmtsai@study tmp]$ zgrep -n 'http' services.gz
14:# http://www.iana.org/assignments/port-numbers
89:http 80/tcp www www-http # WorldWideWeb HTTP
90:http 80/udp www www-http # HyperText Transfer Protocol
.....(下面省略).....
[dmtsai@study ~]$ bzip2 [-cdkzv#] 文件名
[dmtsai@study ~]$ bzcat 文件名.bz2
选项与参数:
-c :将压缩的过程产生的数据输出到屏幕上!
-d :解压缩时用到的参数;
-k :保留原始文件,而不会删除原始的文件。
-z :压缩的参数 (默认值,可以不加);
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快。
范例一:将刚刚 gzip 范例留下来的 /tmp/services 以 bzip2 压缩。
[dmtsai@study tmp]$ bzip2 -v services
services: 5.409:1, 1.479 bits/Byte, 81.51% saved, 670293 in, 123932 out.
[dmtsai@study tmp]$ ls -l services*
-rw-r--r--. 1 dmtsai dmtsai 123932 Jun 30 18:40 services.bz2
-rw-rw-r--. 1 dmtsai dmtsai 135489 Jun 30 18:46 services.gz
# 此时 services 会变成 services.bz2 之外,你也可以发现 bzip2 的压缩比要较 gzip 好。
# 压缩率由 gzip 的 79% 提升到 bzip2 的 81% 了。
范例二:将范例一的文件内容读出来!
[dmtsai@study tmp]$ bzcat services.bz2
范例三:将范例一的文件解压缩。
[dmtsai@study tmp]$ bzip2 -d services.bz2
范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件。
[dmtsai@study tmp]$ bzip2 -9 -c services > services.bz2
[dmtsai@study ~]$ xz [-dtlkc#] 文件名
[dmtsai@study ~]$ xcat 文件名.xz
选项与参数: -d :就是解压缩啊!
-t :测试压缩文件的完整性,看有没有错误
-l :列出压缩文件的相关信息
-k :保留原本的文件不删除~
-c :同样的,就是将数据由屏幕上输出的意思!
-# :同样的,也有较佳的压缩比的意思!
范例一:将刚刚由 bzip2 所遗留下来的 /tmp/services 通过 xz 来压缩!
[dmtsai@study tmp]$ xz -v services
services (1/1)
100 % 97.3 KiB / 654.6 KiB = 0.149
[dmtsai@study tmp]$ ls -l services*
-rw-rw-r--. 1 dmtsai dmtsai 123932 Jun 30 19:09 services.bz2
-rw-rw-r--. 1 dmtsai dmtsai 135489 Jun 30 18:46 services.gz
-rw-r--r--. 1 dmtsai dmtsai 99608 Jun 30 18:40 services.xz
# 各位观众!看到没有啊!!容量又进一步下降的更多耶!好棒的压缩比!
范例二:列出这个压缩文件的信息,然后读出这个压缩文件的内容。
[dmtsai@study tmp]$ xz -l services.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 97.3 KiB 654.6 KiB 0.149 CRC64 services.xz
# 竟然可以列出这个文件的压缩前后的容量,真是太人性化了!这样观察就方便多了!
[dmtsai@study tmp]$ xzcat services.xz
范例三:将文件解压缩
[dmtsai@study tmp]$ xz -d services.xz
范例四:保留原文件的文件名,并且创建压缩文件。
[dmtsai@study tmp]$ xz -k services
[dmtsai@study ~]$ tar [选项] *.tar.gz(目的文件) filename(被打包的文件或目录)
选项与参数:
-c :创建打包文件,可搭配
-v :来察看过程中被打包的文件名(filename)
-x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开。
-z :通过 gzip 的支持进行压缩/解压缩:此时文件名最好为 *.tar.gz 。
-v :在压缩/解压缩的过程中,将正在处理的文件名显示出来!
-f :-f 后面要立刻接要被处理的文件名。
-C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
范例一:使用 tar 加入 -z 的参数备份 /etc/ 目录。
[root@study ~] tar -zcvf /root/etc.tar.gz /etc
范例二: 压缩多个文件,将 /home/pig.txt 和 /home/cat.txt 压缩成 pc.tar.gz
[root@study ~] tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt
范例三:将 pc.tar.gz 解压到当前目录。
[root@study ~] tar -zxvf pc.tar.gz
范例四:将myhome.tar.gz 解压到 /opt/tmp2目录下。
[root@study ~] mkdir /opt/tmp2
[root@study ~] tar -zxvf /home/myhome.tar.gz -C /opt/tmp2
# 注意,在解压缩指定目录时才用到 -C这个选项。
名称 | 对应字符 |
---|---|
标准输入 (stdin) | 代码为 0 ,使用 < 或 << |
标准输出 (stdout) | 代码为 1 ,使用 > 或 >> |
标准错误输出(stderr) | 代码为 2 ,使用 2> 或 2>> |
范例一:观察你的系统根目录 (/) 下各目录的文件名、权限与属性,并记录下来
[dmtsai@study ~]$ ll / # 此时屏幕会显示出文件名信息
[dmtsai@study ~]$ ll / > ~/rootfile # 屏幕并无任何信息
[dmtsai@study ~]$ ll ~/rootfile # 有个新文件被创建了!
-rw-rw-r--. 1 dmtsai dmtsai 1078 Jul 9 18:51 /home/dmtsai/rootfile
那么假如我想要将数据输出到 list 这个文件中呢?
执行“ find /home -name .bashrc > list ” 会有什么结果?
- 你会发现 list 里面只存了那个“正确”的输出数据, 至于屏幕上还是会有错误的讯息出现。所以,如果想要将正确的与错误的数据分别存入不同的文件中需要怎么做?
范例二,将 stdout 与 stderr 分存到不同的文件去
[dmtsai@study ~]$ find /home -name .bashrc > list_right 2> list_error
如果我知道错误讯息会发生,所以要将错误讯息忽略掉而不显示或储存呢? 这个时候黑洞设备 /dev/null 就很重要了。这个 /dev/null 可以吃掉任何导向这个设备的数据,将上述的范例修订一下:
范例三,将错误的数据丢弃,屏幕上显示正确的数据
[dmtsai@study ~]$ find /home -name .bashrc 2> /dev/null /home/dmtsai/.bashrc
# 只有 stdout 会显示到屏幕上, stderr 被丢弃了。
如果我要将正确与错误数据通通写入同一个文件去呢?这个时候就得要使用特殊的写法了! 我们同样用下面的案例来说明:
范例四:将指令的数据全部写入名为 list 的文件中
[dmtsai@study ~]$ find /home -name .bashrc > list 2> list # 出现错误
[dmtsai@study ~]$ find /home -name .bashrc > list 2>&1 # 正确
[dmtsai@study ~]$ find /home -name .bashrc &> list # 正确
范例五:利用 cat 指令来创建一个文件的简单流程
[dmtsai@study ~]$ cat > catfile
testing
cat file test # 这里按下 [ctrl]+d 来离开
[dmtsai@study ~]$ cat catfile
testing
cat file test
那能不能用纯文本文件取代键盘的输入,也就是说,用某个文件的内容 来取代键盘的敲击呢? 可以的!如下所示:
范例六:用 stdin 取代键盘的输入以创建新文件的简单流程
[dmtsai@study ~]$ cat > catfile < ~/.bashrc
[dmtsai@study ~]$ ll catfile ~/.bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Mar 6 06:06 /home/dmtsai/.bashrc
-rw-rw-r--. 1 dmtsai dmtsai 231 Jul 9 18:58 catfile
# 注意看,这两个文件的大小会一模一样!几乎像是使用 cp 来复制一般。
举例来讲:“我要用 cat 直接将输入的讯息输出到 catfile 中, 且当由键盘输入 eof 时,该次输入就结束”,那可以这样做:
[dmtsai@study ~]$ cat > catfile << "eof"
> This is a test.
> OK now stop
> eof # 输入这关键字,立刻就结束而不需要输入 [ctrl]+d
[dmtsai@study ~]$ cat catfile
This is a test.
OK now stop # 只有这两行,不会存在关键字那一行!
假设我们想要知道 /etc/ 目录下面有多少文件,那么可以利用" ls /etc "来查阅,不过, 因为 /etc 下面的文件太多,导致一下子输出就将屏幕塞满了,不知道前面输出的内容是啥,此时,我们可以通过 less 指令的协助,如下:
[dmtsai@study ~]$ ls -al /etc | less
[dmtsai@study ~]$ cut -d'分隔字符' -f fields # 用于有特定分隔字符
[dmtsai@study ~]$ cut -c 字符区间 # 用于排列整齐的讯息
选项与参数:
-d :后面接分隔字符。与 -f 一起使用;
-f :依据 -d 的分隔字符将一段讯息分区成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;
范例一:将 PATH 变量取出,我要找出第五个路径。
[dmtsai@study ~]$ echo ${PATH}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
| 1 | 2 | 3 | 4 | 5 | 6 |
[dmtsai@study ~]$ echo ${PATH} | cut -d ':' -f 5
# 如同上面的数字显示,我们是以“ : ”作为分隔,因此会出现 /home/dmtsai/.local/bin
# 那么如果想要列出第 3 与第 5 呢?,就是这样:
[dmtsai@study ~]$ echo ${PATH} | cut -d ':' -f 3,5
范例二:将 export 输出的讯息,取得第 12 字符以后的所有字串
[dmtsai@study ~]$ export
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/home/dmtsai"
declare -x HOSTNAME="study.centos.vbird"
.....(其他省略).....
# 注意看,每个数据都是排列整齐的输出。
# 如果我们不想要“ declare -x ”时,就得这么做:
[dmtsai@study ~]$ export | cut -c 12-
HISTCONTROL="ignoredups"
HISTSIZE="1000"
HOME="/home/dmtsai"
HOSTNAME="study.centos.vbird"
.....(其他省略).....
# 知道怎么回事了吧?用 -c 可以处理比较具有格式的输出数据!
# 我们还可以指定某个范围的值,例如第 12-20 的字符,就是 cut -c 12-20 。
范例三:用 last 将显示的登陆者的信息中,仅留下使用者大名。
[dmtsai@study ~]$ last
root pts/1 192.168.201.101 Sat Feb 7 12:35 still logged in
root pts/1 192.168.201.101 Fri Feb 6 12:13 - 18:46 (06:33)
root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16)
# last 可以输出“帐号/终端机/来源/日期时间”的数据,并且是排列整齐的。
[dmtsai@study ~]$ last | cut -d ' ' -f 1
# 由输出的结果我们可以发现第一个空白分隔的字段代表帐号,所以使用如上指令:
# 但是因为 root pts/1 之间空格有好几个,并非仅有一个,所以,如果要找出
# pts/1 其实不能以 cut -d ' ' -f 1,2 喔!输出的结果会不是我们想要的。
[dmtsai@study ~]$ grep [选项] '搜寻字串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字串' 的次数
-i :忽略大小写的不同,所有大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字串' 内容的那一行!
范例一:将 last 当中,有出现 root 的那一行就取出来;
[dmtsai@study ~]$ last | grep 'root'
范例二:与范例一相反,只要没有 root 的就取出!
[dmtsai@study ~]$ last | grep -v 'root'
范例三:在 last 的输出讯息中,只要有 root 就取出,并且仅取第一栏
[dmtsai@study ~]$ last | grep 'root' | cut -d ' ' -f1
# 在取出 root 之后,利用上个指令 cut 的处理,就能够仅取得第一栏啰!
范例四:取出 /etc/man_db.conf 内含 MANPATH 的那几行
[dmtsai@study ~]$ grep 'MANPATH' /etc/man_db.conf
....(前面省略)....
MANPATH_MAP /usr/games /usr/share/man
MANPATH_MAP /opt/bin /opt/man
MANPATH_MAP /opt/sbin /opt/man
[dmtsai@study ~]$ sort [-fbMnrtuk] [file or stdin]
选项与参数:
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空白字符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用“纯数字”进行排序(默认是以文字体态来排序的);
-r :反向排序; -u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符号,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思
范例一:个人帐号都记录在 /etc/passwd 下,请将帐号进行排序。
[dmtsai@study ~]$ cat /etc/passwd | sort
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
alex:x:1001:1002::/home/alex:/bin/bash
# 省略很多的输出,由上面的数据看,sort 是默认“以第一个”数据来排序,
# 而且默认是以“文字”型态来排序的,所以由 a 开始排到最后。
范例二:/etc/passwd 内容是以 : 来分隔的,我想以第三栏来排序,该如何?
[dmtsai@study ~]$ cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
dmtsai:x:1000:1000:dmtsai:/home/dmtsai:/bin/bash
alex:x:1001:1002::/home/alex:/bin/bash
arod:x:1002:1003::/home/arod:/bin/bash
# 如果是以文字体态来排序的话,原本就会是这样,想要使用数字排序:
# cat /etc/passwd | sort -t ':' -k 3 -n
# 必须用 -n 选项来告知 sort 以数字来排序。
范例三:利用 last ,将输出的数据仅取帐号,并加以排序
[dmtsai@study ~]$ last | cut -d ' ' -f1 | sort
[dmtsai@study ~]$ uniq [-ic]
选项与参数:
-i :忽略大小写字符的不同;
-c :进行计数
范例一:使用 last 将帐号列出,仅取出帐号栏,进行排序后仅取出一位;
[dmtsai@study ~]$ last | cut -d ' ' -f1 | sort | uniq
范例二:承上题,如果我还想要知道每个人的登陆总次数呢?
[dmtsai@study ~]$ last | cut -d ' ' -f1 | sort | uniq -c
1 # 啥都没有代表空白行
6 (unknown
47 dmtsai
4 reboot
7 root
1 wtmp
# 从上面的结果可以发现 reboot 有 4 次, root 登陆则有 7 次。大部分是以 dmtsai 来操作。
# wtmp 与第一行的空白行都是 last 的默认字符,那两个可以忽略。
[dmtsai@study ~]$ wc [-lwm]
选项与参数:
-l :仅列出行;
-w :仅列出多少字(英文单字);
-m :多少字符;
范例一:那个 /etc/man_db.conf 里面到底有多少相关字、行、字符数? [dmtsai@study ~]$ cat /etc/man_db.conf | wc
131 723 5171
# 输出的三个数字中,分别代表: “行、字数、字符数”
范例二:我知道使用 last 可以输出登陆者,但是 last 最后两行并非帐号内容,那么请问, 我该如何以一行指令串取得登陆系统的总人次?
[dmtsai@study ~]$ last | grep [a-zA-Z] | grep -v 'wtmp' | grep -v 'reboot' | grep -v 'unknown' | wc -l
# 由于 last 会输出空白行, wtmp, unknown, reboot 等无关帐号登陆的信息,
# 因此,利用 grep 取出非空白行,以及去除上述关键字那几行,再计算行数即可。
想个简单的东西,我们由前一节知道( > )会将数据流整个传送给文件或设备,因此我们除非去读取该文件或设备,否则就无法继续利用这个数据流。如果想要将这个数据流的处理过程中将某段讯息存下来,利用 tee 指令就可以了。
tee 指令会同时将数据流分送到文件去与屏幕 (screen);而输出到屏幕的数据其实就是 stdout , 这样就可以通过管道( | )让下个指令继续处理了。
用法如下:
[dmtsai@study ~]$ tee [-a] file
选项与参数:
-a :以累加 (append) 的方式,将数据加入 file 当中!
[dmtsai@study ~]$ last | tee last.list | cut -d " " -f1
# 这个范例可以让我们将 last 的输出的数据存一份到 last.list 文件中,
# 同时屏幕会输出使用 cut 指令处理后的数据。
[dmtsai@study ~]$ ls -l /home | tee ~/homefile | more
# 这个范例则是将 ls 的数据存一份到 ~/homefile ,同时屏幕也有输出数据;
[dmtsai@study ~]$ ls -l / | tee -a ~/homefile | more
# 要注意!默认情况下 tee 指令后接的文件会被覆盖,若加上 -a 这个选项则能将数据累加。
[dmtsai@study ~]$ paste [-d] file1 file2
选项与参数:
-d :后面可以接分隔字符。默认是以 [tab] 来分隔的。
- :如果 file 部分写成 - ,表示来自 standard input 的数据的意思。
范例一:用 root 身份,将 /etc/passwd 与 /etc/shadow 同一行贴在一起。
[root@study ~] paste /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash root:$6$wtbCCce/PxMeE5wm$KE2IfSJr...:16559:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin bin:*:16372:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:16372:0:99999:7:::
# 注意喔!同一行中间是以 [tab] 按键隔开的!
范例二:先将 /etc/group 读出(用 cat),然后与范例一贴上一起!且仅取出前三行
[root@study ~] cat /etc/group | paste /etc/passwd /etc/shadow - | head -n 3
# 这个例子的重点在( - )符号的使用,( - )符号常常代表 stdin 。
[root@study ~] mkdir /tmp/homeback
[root@study ~] tar -cvf - /home | tar -xvf - -C /tmp/homeback