赞
踩
本篇博文介绍了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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。