linux命令从入门到精通

更新时间:2023-07-18 12:27:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

linux 命令教程

001d 目录。l 符号链接(指向另一个文件 )。s 套接字文件。b 块设备文件。c 字符设备文件。p 命名管道文件。 对于文件属主来说,在只有读权限位被置位的情况下,仍然可以通过文件重定向的方法向该文件写入。 chmod命令的一般格式为: chmod [who] operator [permission] filename who的含义是: u 文件属主权限。 g 同组用户权限。 o 其他用户权限。 a 所有用户(文件属主、同组用户及其他用户 )。 operator的含义: + 增加权限。 - 取消权限。 = 设定权限。 permission的含义: r 读权限。 w 写权限。 x 执行权限。 s 文件属主和组set-ID。 t 粘性位*。 l 给文件加锁,使其他用户无法访问。 u,g,o 针对文件属主、同组用户及其他用户的操作。 如果在文件列表时看到“ t” ,那么这就意味着该脚本或程序在执行时会被放在交换区 (虚存)。不过由于当今的内存价格如此之低,大可不必理会文件的“ t”的使用。r=4 w=2 x=1如果希望一次设置目录下所有文件的权限,可以用:chmod 644*这将使文件属主和同组用户都具有读和写的权限,其他用户只具有读权限。 “t”代表了粘性位。如果在一个目录上出现 *在列文件或目录时,有时会遇到“ t”位。“t”位,这就意味着该目录中的文件只有其属主才可以删除,即使某个同组用户具有和属主同等的权限。不过有的系统在这一规则上并不十分严格。 还可以通过使用 -R选项连同子目录下的文件一起设置: chmod -R 664 /usr/local/home/dave/* 这样就可以一次将 /usr/local/home/dave目录下的所有文件连同各个子目录下的文件的权限全部设置为文件属主和同组用户可读和写,其他用户只读。使用 - R选项一定要谨慎,只有在需要改变目录树下全部文件权限时才可以使用。 目录的读权限位意味着可以列出其中的内容。写权限位意味着可以在该目录中创建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位。执行权限位则意味着搜索和访问该目录chmod -R -h owner file - R选项意味着对所有子目录下的文件也都进行同样的操作。 - h选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件如果你希望知道自己属于哪些用户组,可以用如下的命令:group 或者用id命令为了找出其他用户所属于的组,可以用如下的命令:gro
up Jacky 当最初登录到系统中时, u m a s k命令确定了你创建文件的缺省模式。这一命令实际上和c h m o d命令正好相反。你的系统管理员必须要为你设置一个合理的 u m a s k值,以确保你创建的文件具有所希望的缺省权限,防止其他非同组用户对你的

linux 命令教程

文件具有写权限。 在已经登录之后,可以按照个人的偏好使用 umask命令来改变文件创建的缺省权限。相应的改变直到退出该 shell或使用另外的umask命令之前一直有效。 一般来说, u m a s k命令是在 / e t c / p r o f i l e文件中设置的,每个用户在登录时都会引用这个文件,所以如果希望改变所有用户的 umask,可以在该文件中加入相应的条目。如果希望永久性地设置自己的umask值,那么就把它放在自己 $HOME目录下的.profile或.bash_profile文件中。 u m a s k命令允许你设定文件创建时的缺省模式,对应每一类用户 (文件属主、同组用户、其他用户 )存在一个相应的 u m a s k值中的数字。对于文件来说,这一数字的最大值分别是 6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用 c h m o d命令增加这一权限。目录则允许设置执行权限,这样针对目录来说, umask中各个数字最大可以到 7。 该命令的一般形式为: umask nnn 其中nnn为umask置000-777。例如,umask值002 所对应的文件和目录创建缺省权限分别为 664和775 umask值与权限 umask 文 件 目 录 0 6 7 1 6 6 2 4 5 3 4 4 4 2 3 5 2 2 6 0 1 7 0 0 对于 umask值002,相应的文件和目录缺省创建权限是什么呢? 第一步,我们首先写下具有全部权限的模式,即 777(所有用户都具有读、写和执行权限 )。 第二步,在下面一行按照 umask值写下相应的位,在本例中是 002。 第三步,在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。稍加练习就能够记住这种方法。 第四步,对于文件来说,在创建时不能具有文件权限,只要拿掉相应的执行权限比特即可。 这就是上面的例子,其中 umask值为002: 1) 文件的最大权限 rwx rwx rwx (777) 2) umask值为002 - - - - - - -w- 3) 目录权限 这就是目录创建缺省权限 rwx rwx r-x (775) 4) 文件权限 这就是文件创建缺省权限 rw- rw- r-- (664) 下面是另外一个例子,假设这次 umask值为022: 1) 文件的最大权限 rwx rwx rwx (777) 2) umask值为022 - - - -w- -w- 3) 目录权限 这就是目录创建缺省权限 rwx r-x r-x (755) 4) 文件权限 这就是文件创建缺省权限
rw- r-- r-- (644)如果想知道当前的 umask 值,可以使用umask命令:wangjian@wangjian-laptop:~$ umask0022 存在两种不同类型的链接,软链接和硬链接,这里我们只讨论软链接

linux 命令教程

。软链接实际上就是一个指向文件的指针。你将会发现这种软链接使用起来非常方便。 下面我们就解释一下符号链接是怎么回事。比方说在 / u s r / l o c a l / a d m i n / s a l e s目录下有一个含有销售信息的文件,销售部门的每一个人都想看这份文件。你可以在每一位用户的 $ H O M E目录下建立一个指向该文件的链接,而不是在每个目录下拷贝一份。这样当需要更改这一文件时,只需改变一个源文件即可。每个销售 $ H O M E目录中的链接可以起任何名字,不必和源文件一致。 如果有很多子目录,而进入这些目录很费时间,在这种情况下链接也非常有用。可以针对$ H O M E目录下的一个很深的子目录创建一个链接。还有,比如在安装一个应用程序时,它的日志被保存到 /usr/opt/app/log目录下,如果想把它保存在另外一个你认为更方便目录下,可以建立一个指向该目录的链接。 该命令的一般形式为: ln [-s] source_path target_path 其中的路径可以是目录也可以是文件。 假如系统中有 4 0个销售和管理用户,销售用户使用一个销售应用程序,而管理用户使用一个管理应用程序。我作为系统管理员该怎么做呢?首先删除它们各自 $ H O M E目录下的所有. p r o f i l e文件。然后在 / u s r / l o c a l / m e n u s /目录下创建两个 p r o f i l e文件,一个是 s a l e s . p r o f i l e,一个是admin.profile,它们分别为销售和管理人员提供了所需的环境,并引导他们进入相应的应用程序。现在我在所有销售人员的 $HOME目录下分别创建一个指向 sales.profile的链接,在所有管理人员的 $ H O M E目录下分别创建一个指向 a d m i n . p r o f i l e文件的链接。注意,不必在上面命令格式中的 t a rg e t _ p a t h端创建相应文件,如果不存在这样一个文件, l n命令会自动创建该文件。下面就是我对销售人员 matty所做的操作。 下面是另外一个例子。我所管理的系统中有一个网络监视器,它将日志写在 /usr/opt/m o n i t o r / r e g s t a r目录下,但其他所有的日志都保存在 / v a r / a d m / l o g s目录下,这样只需在该目录下建立一个指向原有文件的链接就可以在一个地方看所有的日志了,而不必花费很多时间分别进入各个相应的目录。下面就是所用的链接命令: $ ln -s /usr/opt/monitor/regstar/reg.log /var/adm/logs/monitor.log 在创建
链接的时候,不要忘记在原有目录设置执行权限。链接一旦创建,链接目录将具有权限 7 7 7或rwx rwx rwx ,但是实际的原有文件的权限并未改变。 在新安装的系统上,通常要进行这样的操作,在 /var目录中创建一个指向 /tmp目录的链接,因为有些应用程序认为存在 / v

linux 命令教程

a r / t m p目录(然而它实际上并不存在 ),有些应用程序在该目录中保存一些临时文件。为了使所有的临时文件都放在一个地方,可以使用 l n命令在/ v a r目录下建立一个指向 /tmp目录的链接。ln -s /tmp /var/tmp002 Find命令的一般形式为: find pathname -options [-print -exec -ok] 让我们来看看该命令的参数: pathname find命令所查找的目录路径。例如用 .来表示当前目录,用 /来表示系统根目录。 -print find命令将匹配的文件输出到标准输出。 -exec find命令对匹配的文件执行该参数所给出的 s h e l l命令。相应命令的形式为 ' c o m m -and' {} \;,注意{}和\;之间的空格。 -ok 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 f i n d命令有很多选项或表达式,每一个选项前面跟随一个横杠 -。让我们先来看一下该命令的主要选项,然后再给出一些例子。 -name 按照文件名查找文件。 -perm 按照文件权限来查找文件。 -prune 使用这一选项可以使 find命令不在当前指定的目录中查找,如果同时使用了 -depth选项,那么 -prune选项将被find命令忽略。 -user 按照文件属主来查找文件。 -group 按照文件所属的组来查找文件。 -mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在 n天以内,+n表示文件更改时间距现在 n天以前。Find命令还有-atime和-ctime选项,但它们都和 -mtime选项相似,所以我们在这里只介绍 -mtime选项。 -nogroup 查找无有效所属组的文件,即该文件所属的组在 /etc/groups中不存在。 -nouser 查找无有效属主的文件,即该文件的属主在 /etc/passwd中不存在。 -newer file1 ! file2 查找更改时间比文件 file1新但比文件 file2旧的文件。 -type 查找某一类型的文件,诸如: b - 块设备文件。 d - 目录。 c - 字符设备文件。 p - 管道文件。 l - 符号链接文件。 f - 普通文件。 -size n[c] 查找文件长度为 n块的文件,带有 c时表示文件长度以字节计。 -depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件 -fstype/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。 -mount 在查找
文件时不跨越文件系统 mount点。 -follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。 -cpio 对匹配的文件使用 cpio命令,将这些文件备份到磁带设备中。 不管当前路径是什么,如果想要在自己的根目录 $ H O M E中查找文件

linux 命令教程

名符合 * . t x t的文件,使用~作为'pathname参数,波浪号~代表了你的 $HOME目录。 $ find ~ -name "*.txt" -print 想要在当前目录及子目录中查找所有的‘ *.txt’文件,可以用: $ find . -name "*.txt" -print 想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用: $ find . -name "[A-Z]*" -print 想要在/etc目录中查找文件名以 host开头的文件,可以用: $ find /etc -name "host*" -print 想要查找$HOME目录中的文件,可以用: $ f i n d ~ - n a m e " * " - p r i或f i n d . - p r i n t nt 要想让系统高负荷运行,就从根目录开始查找所有的文件。如果希望在系统管理员那里保留一个好印象的话,最好在这么做之前考虑清楚! $ find / -name "*" -print 如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是 * . t x t的文件,下面的命令就能够返回名为 ax37.txt的文件:$ find . -name "[a-z][a-z][0--9][0--9].txt" -print 如果希望按照文件权限模式来查找文件的话,可以采用 - p e r m选项。你可能需要找到所有用户都具有执行权限的文件,或是希望查看某个用户目录下的文件权限类型。在使用这一选项的时候,最好使用八进制的权限表示法。 为了在当前目录下查找文件权限位为 7 5 5的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用: $ find . -perm 755 -print 如果希望在当前目录下查找所有用户都可读、写、执行的文件(要小心这种情况) ,我们可以使用 f i n d命令的 - p e r m选项。在八进制数字前面要加一个横杠 -。在下面的命令中 - p e r m代表按照文件权限查找,而‘ 007’和你在chmod命令的绝对模式中所采用的表示法完全相同。 $ find . -perm -007 -print2.1.3 忽略某个目录 如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用 - p r u n e选项来指出需要忽略的目录。在使用 - p r u n e选项时要当心,因为如果你同时使用了-depth选项,那么 -prune选项就会被 find命令忽略。 如果希望在 /apps目录下查找文件,但不希望在 /apps/bin目录下查找,可以用: $ find /apps -name "/apps/bin" -prune -o -print2.1.4 使用user和nouser选项 如果希望按照文件属主查找文件,可以给出相应的用户名。例如,在 $ H O M E目录中查找文件属主为 dave的文件,可以用: $ find ~ -user dave -print 在/etc目录下查找文件属主为 u
ucp的文件: $ find /etc -user uucp -print 为了查找属主帐户已经被删除的文件,可以使用 - n o u s e r选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用 -nouser选项时,不必给出用户

linux 命令教程

名; find命令能够为你完成相应的工作。例如,希望在 /home目录下查找所有的这类文件,可以用: $ find /home -nouser -print2.1.5 使用group和nogroup选项 就像u s e r和n o u s e r选项一样,针对文件所属于的用户组, f i n d命令也具有同样的选项,为了在/apps目录下查找属于 accts用户组的文件,可以用: $ find /apps -group accts -print 要查找没有有效所属用户组的所有文件,可以使用 n o g r o u p选项。下面的 f i n d命令从文件系统的根目录处查找这样的文件 $ fine/-nogroup-print2.1.6 按照更改时间查找文件 如果希望按照更改时间来查找文件,可以使用 mtime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用 m t i m e选项来查找这样的文件。用减号-来限定更改时间在距今 n日以内的文件,而用加号 +来限定更改时间在距今 n日以前的文件。 希望在系统根目录下查找更改时间在 5日以内的文件,可以用: $ find / -mtime -5 -print 为了在/var/adm目录下查找更改时间在 3日以前的文件,可以用: $ find /var/adm -mtime +3 -print2.1.7 查找比某个文件新或旧的文件 如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用 - n e w e r选项。它的一般形式为: newest_file_name ! oldest_file_name 其中,!是逻辑非符号。 这里有两个文件,它们的更改时间大约相差两天。age.awk 4/18 belts.awk 4/20 下面给出的 find命令能够查找更改时间比文件 age.awk新但比文件 belts.awk旧的文件:find . -newer age.awk ! -newer belts.awk -exec ls -l {} \; 如果想使用 find命令的这一选项来查找更改时间在两个小时以内的文件,除非有一个现成的文件其更改时间恰好在两个小时以前,否则就没有可用来比较更改时间的文件。为了解决这一问题,可以首先创建一个文件并将其日期和时间戳设置为所需要的时间。这可以用 t o u c h命令来实现。 假设现在的时间是 2 3 : 4 0,希望查找更改时间在两个小时以内的文件,可以首先创建这样一个文件: 一个符合要求的文件已经被创建;这里我们假设今天是五月四日,而该文件的更改时间是21:40,比现在刚好早两个小时。 现在我们就可以使用 f i n d命令的- n e w e r选项在当前目录下查找所有更改时间在两个小时以内的文件: $ find . -newer dstamp -print2.1.8 使用type选项
UNIX或LINUX系统中有若干种不同的文件类型,这部分内容我们在前面的章节已经做了介绍,这里就不再赘述。如果要在 /etc目录下查找所有的目录,可以用: $ find /etc -type d -print 为了在当前目录下查找除目录以外的所有类型的文件,可以用:

linux 命令教程

$ find . ! -type d -print 为了在/etc目录下查找所有的符号链接文件,可以用: $ find /etc -type l -print2.1.9 使用size选项 可以按照文件长度来查找文件,这里所指的文件长度既可以用块( b l o c k)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为 N c;以块计量文件长度只用数字表示即可。 就我个人而言,我总是使用以字节计的方式,在按照文件长度查找文件时,大多数人都喜欢使用这种以字节表示的文件长度,而不用块的数目来表示,除非是在查看文件系统的大小,因为这时使用块来计量更容易转换。 为了在当前目录下查找文件长度大于 1M字节的文件,可以用: $ find . -size +1000000c -print 为了在/home/apache目录下查找文件长度恰好为 100字节的文件,可以用: $ find /home/apache -size 100c -print 为了在当前目录下查找长度超过 10块的文件(一块等于 512字节) ,可以用: $ find . -size +10 -print2.1.10 使用depth选项 在使用 f i n d命令时,可能希望先匹配所有的文件,再在子目录中查找。使用 d e p t h选项就可以使find命令这样做。这样做的一个原因就是,当在使用 find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。 在下面的例子中, f i n d命令从文件系统的根目录开始,查找一个名为 C O N . F I L E的文件。它将首先匹配所有的文件然后再进入子目录中查找。 $ find / -name "CON.FILE" -depth -print2.1.11 使用mount选项 在当前的文件系统中查找文件(不进入其他文件系统) ,可以使用 f i n d命令的 m o u n t选项。在下面的例子中,我们从当前目录开始查找位于本文件系统中文件名以 XC结尾的文件: $ find . -name "*.XC" -mount -print2.1.13 使用exec或ok来执行shell命令 当匹配到一些文件以后,可能希望对其进行某些操作,这时就可以使用 - e x e c选项。一旦f i n d命令匹配到了相应的文件,就可以用 - e x e c选项中的命令对其进行操作(在有些操作系统中只允许 - e x e c选项执行诸如 l s或ls -l这样的命令) 。大多数用户使用这一选项是为了查找旧文件并删除它们。这里我强烈地建议你在真正执行 r m命令删除文件之前,最好先用 l s命令看一下,确认它们是所要删除的文件。 e x e c选项后面跟随着所要执行的命令,然后是一对儿 { },一个空格和一个 \,最后是一个分号。 为了使用 e x e c选项,
必须要同时使用 p r i n t选项。如果验证一下 f i n d命令,会发现该命令只输出从当前路径起的相对路径及文件名。 为了用ls -l 命令列出所匹配到的文件,可以把 ls -l 命令放在find命令的-exec选项中,例如:wangjian@wangjian-

linux 命令教程

laptop:~$ find . -name file2 -exec ls -l {} \;-rw-rw-r-- 1 wangjian wangjian 0 2009-08-14 09:08 ./file2 上面的例子中, find命令匹配到了当前目录下的所有普通文件,并在 -exec选项中使用ls -l命令将它们列出。 为了在/logs目录中查找更改时间在 5日以前的文件并删除它们,可以用: $ find logs -type f -mtime +5 -exec rm {} \; 记住,在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心! 当使用诸如 mv或rm命令时,可以使用 -exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。在下面的例子中, f i n d命令在当前目录中查找所有文件名以 . L O G结尾、更改时间在 5日以上的文件,并删除它们,只不过在删除之前先给出提示。wangjian@wangjian-laptop:~$ find . -name myfile -ok rm {} \;< rm ... ./myfile > ? y 按y键删除文件,按 n键不删除。 任何形式的命令都可以在 -exec选项中使用。2.1.14 find命令的例子 我们已经介绍了 find命令的基本选项,下面给出 find命令的一些其他的例子。 为了匹配$HOME目录下的所有文件,下面两种方法都可以使用: $ find $HOME -print $ find ~ -print 为了在当前目录中查找 suid置位,文件属主具有读、写、执行权限,并且文件所属组的用户和其他用户具有读和执行的权限的文件,可以用: $ find . -type f -perm 4755 -print 为了查找系统中所有文件长度为 0的普通文件,并列出它们的完整路径,可以用: $ find / -type f -size 0 -exec ls -l {} \; 为了查找/var/logs目录中更改时间在 7日以前的普通文件,并删除它们,可以用: $ find /var/logs -type f -mtime +7 -exec rm {} \; 为了查找系统中所有属于 audit组的文件,可以用: $find /-name -group audit -print 我们的一个审计系统每天创建一个审计日志文件。日志文件名的最后含有数字,这样我们一眼就可以看出哪个文件是最新的,哪个是最旧的。 A d m i n . l o g 文件编上了序号:a d m i n . l o g . 0 0 1、a d m i n . l o g . 0 0 2等等。下面的 f i n d命令将删除 / l o g s目录中访问时间在 7日以前、含有数字后缀的 a d m i n . l o g文件。该命令只检查三位数字,所以相应日志文件的后缀不要超过999。 '- a t i m $ find /logs -name 'admin.log[0-9][0-9][0-9] e +7 -exec rm {} \; 为了查找当前文件系统中的所有目录并排序,可以用: $ find . -type d -print -local -
mount |sort 为了查找系统中所有的 rmt磁带设备,可以用: $ find /dev/rmt -print 在使用f i n d命令的- e x e c选项处理匹配到的文件时, f i n d命令将所有匹配到的文件一起传递给e x

linux 命令教程

e c执行。不幸的是,有些系统对能够传递给 e x e c的命令长度有限制,这样在 f i n d命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出” 。这就是x a rg s命令的用处所在,特别是与 f i n d命令一起使用。 F i n d命令把匹配到的文件传递给 x a rg s命令,而x a rg s命令每次只获取一部分文件而不是全部,不像 - e x e c选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。在有些系统中,使用 - e x e c选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用x a rg s命令则只有一个进程。另外,在使用 x a rg s命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。 让我们来看看xargs命令是如何同find命令一起使用的,并给出一些例子。 下面的例子查找系统中的每一个普通文件,然后使用 x a rg s命令来测试它们分别属于哪类文件:find / -type f -print |xargs file 下面的例子在整个系统中查找内存信息转储文件 ( c o r e d u m p ) ,然后把结果保存到/tmp/core.log 文件中:wangjian@wangjian-laptop:~$ find . -name "core" -print | xargs echo "" >/tmp/core.log003 第3章 后台执行命令 当你在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要的事情要做,比如阅读电子邮件。对于密集访问磁盘的进程,你可能希望它能够在每天的非负荷高峰时间段运行。为了使这些进程能够在后台运行,也就是说不在终端屏幕上运行,有几种选择方法可供使用。 在本章中我们将讨论: 设置crontab文件,并用它来提交作业。 使用at命令来提交作业。 在后台提交作业。 使用nohup命令提交作业。 名词解释: 系统调度进程。可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月 cron中的不同时段运行。 At at 命令。使用它在一个特定的时间运行一些特殊的作业,或在晚一些的非负荷高峰时间段或高峰负荷时间段运行。 & 使用它在后台运行一个占
用时间不长的进程。 Nohup 使用它在后台运行一个命令,即使在用户退出时也不受影响。3.1 cron和crontab c r o n是系统主要的调度进程,可以在无需人工干预的情况下运行作业。有一个叫做c r o n t a b的命令允许用户提交、编辑

linux 命令教程

或删除相应的作业。每一个用户都可以有一个 c r o n t a b文件来保存调度信息。可以使用它运行任意一个 s h e l l脚本或某个命令,每小时运行一次,或一周三次,这完全取决于你。每一个用户都可以有自己的 c r o n t a b文件,但在一个较大的系统中,系统管理员一般会禁止这些文件,而只在整个系统保留一个这样的文件。系统管理员是通过cron.deny和cron.allow这两个文件来禁止或允许用户拥有自己的 crontab文件。3.1.1 crontab的域 为了能够在特定的时间运行作业,需要了解 c r o n t a b文件每个条目中各个域的意义和格式。下面就是这些域: 第1列 分钟1~59 第2列 小时1~23(0表示子夜) 第3列 日1~31 第4列 月1~12 第5列 星期0~6(0表示星期天) 第6列 要运行的命令 23 第3章 后台执行命令 下载 下面是crontab的格式: 分<>时<>日<>月<>星期<>要运行的命令 其中<>表示空格。 C r o n t a b文件的一个条目是从左边读起的,第一列是分,最后一列是要运行的命令,它位于星期的后面。 在这些域中,可以用横杠 -来表示一个时间范围,例如你希望星期一至星期五运行某个作业,那么可以在星期域使用 1 - 5来表示。还可以在这些域中使用逗号“,” ,例如你希望星期一和星期四运行某个作业,只需要使用 1 , 4来表示。可以用星号 *来表示连续的时间段。如果你对某个表示时间的域没有特别的限定,也应该在该域填入 *。该文件的每一个条目必须含有 5个时间域,而且每个域之间要用空格分隔。该文件中所有的注释行要在行首用 #来表示。3.1.2 crontab条目举例 这里有crontab文件条目的一些例子: 30 21* * * /apps/bin/cleanup.sh 上面的例子表示每晚的 21:30运行/apps/bin目录下的cleanup.sh。 45 4 1,10,22 * * /apps/bin/backup.sh 上面的例子表示每月 1、10、22日的4:45运行/apps/bin目录下的backup.sh。 10 1 * * 6,0 /bin/find -name "core" -exec rm {} \; 上面的例子表示每周六、周日的 1:10运行一个find命令。 0,30 18-23 * * * /apps/bin/dbcheck.sh 上面的例子表示在每天 18:00至23:00之间每隔30分钟运行/apps/bin目录下的dbcheck.sh。 0 23 * * 6 /apps/bin/qtrend.sh 上面的例子表示每星期六的 11:00pm运行/apps/bin目录下的qt
rend.sh。 你可能已经注意到上面的例子中,每个命令都给出了绝对路径。当使用 c r o n t a b运行s h e l l脚本时,要由用户来给出脚本的绝对路径,设置相应的环境变量。记住,既然是用户向 c r o n提交了这些作业,就要向 cron提供所需的全部环境。

linux 命令教程

不要假定 cron知道所需要的特殊环境,它其实并不知道。所以你要保证在 s h e l l脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。 如果cron不能运行相应的脚本,用户将会收到一个邮件说明其中的原因。3.1.3 crontab命令选项 crontab命令的一般形式为: Crontab [-u user] -e -l -r 其中: -u 用户名。 -e 编辑crontab文件。 -l 列出crontab文件中的内容。 -r 删除crontab文件。 如果使用自己的名字登录,就不用使用 - u选项,因为在执行 c r o n t a b命令时,该命令能够 24 第一部分 shell 下载知道当前的用户。3.1.4 创建一个新的crontab文件 在考虑向 c r o n进程提交一个 c r o n t a b文件之前,首先要做的一件事情就是设置环境变量E D I TO R。c r o n进程根据它来确定使用哪个编辑器编辑 c r o n t a b文件。 9 9 %的U N I X和L I N U X用户都使用 v i,如果你也是这样,那么你就编辑 $ H O M E目录下的 . p r o f i l e文件,在其中加入这样一行: EDITOR=vi; export EDITOR 然后保存并退出。 不妨创建一个名为 < u s e r > c r o n的文件,其中 < u s e r >是用户名,例如, d a v e c r o n。在该文件中加入如下的内容。#(put your own initials here) echo the date to the console every#15 minutes between 6 pm and 6 am0,15,30,45 18-06 * * * /bin/echo `date` > /dev/console 保存并退出。确信前面 5个域用空格分隔。 在上面的例子中,系统将每隔 1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些系统中,用 tty1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。 为了提交你刚刚创建的 crontab文件,可以把这个新创建的文件作为 cron命令的参数: $ crontab davecron 现在该文件已经提交给 cron进程,它将每隔 15分钟运行一次。 同时,新创建文件的一个副本已经被放在 /var/spool/cron目录中,文件名就是用户名(即, 。dave)3.1.5 列出crontab文件 为了列出crontab文件,可以用:wangjian@wangjian-laptop:~$ crontab -l#(put your own initials here) echo the date to the console every#15 minutes between 6 pm and 6 am0,15,30,45 18-06 * * * /bin/echo `date` > /dev/console 你将会看到和上面类似的内容。可以使用这种方法在 $ H O M E目录中对 c r o n t a b文件做一备份: $ cronta
b -l > $HOME/mycron 这样,一旦不小心误删了 crontab文件,可以用上一节所讲述的方法迅速恢复。3.1.6 编辑crontab文件 如果希望添加、删除或编辑 crontab文件中的条目,而 EDITOR环境变量又设置为 vi,那么

linux 命令教程

就可以用vi来编辑crontab文件,相应的命令为: $ crontab -e 可以像使用 v i编辑其他任何文件那样修改 c r o n t a b文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。3.1.7 删除crontab文件 为了删除crontab文件,可以用: $ crontab -r3.1.8 恢复丢失的crontab文件 如果不小心误删了 c r o n t a b文件,假设你在自己的 $ H O M E目录下还有一个备份,那么可以将其拷贝到 /var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完成拷贝,可以用: $ crontab <filename> 其中,<filename>是你在$HOME目录中副本的文件名。 我建议你在自己的 $ H O M E目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为 r键紧挨在e键的右边 ...) 。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。 有些c r o n t a b的变体有些怪异,所以在使用 c r o n t a b命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲 delete键退出,不要按<Ctrl-D>,否则你将丢失 crontab文件。3.2 at命令 a t命令允许用户向 c r o n守护进程提交作业,使其在稍后的时间运行。这里稍后的时间可能是指10min以后,也可能是指几天以后。如果你希望在一个月或更长的时间以后运行,最好还是使用crontab文件。 一旦一个作业被提交, a t命令将会保留所有当前的环境变量,包括路径,不象 c r o n t a b,只提供缺省的环境。该作业的所有输出都将以电子邮件的形式发送给用户,除非你对其输出进行了重定向,绝大多数情况下是重定向到某个文件中。 和c r o n t a b一样,根用户可以通过 / e t c目录下的 a t . a l l o w和a t . d e n y文件来控制哪些用户可以使用at命令,哪些用户不行。不过一般来说,对 at命令的使用不如对 crontab的使用限制那么严格。 at命令的基本形式为: at [-f script] [-m -l -r] [time] [date] 其中, -f script 是所要提交的脚本或命令。 -l 列出当前所有等待运行的作业。 atq命令具有相同的作用。 清除作业。为了清除某个作业,还要提供相应的作业标识( I D);有些 U N I X变体只 -r接受atrm作为清除命令。 -m 作业完成后给用户发
邮件。 time at命令的时间格式非常灵活;可以是 H、H H . H H M M、H H : M M或H : M,其中H和M分别是小时和分钟。还可以使用 a.m.或p.m.。 日期格式可以是月份数或日期数,而且 at命令还能够识别诸如 to

linux 命令教程

day、tomorrow这样 date的词。 现在就让我们来看看如何提交作业。3.2.1 使用at命令提交命令或脚本 使用at命令提交作业有几种不同的形式,可以通过命令行方式,也可以使用 at命令提示符。一般来说在提交若干行的系统命令时,我使用 at命令提示符方式,而在提交 shell脚本时,使用命令行方式。 如果你想提交若干行的命令,可以在 at命令后面跟上日期 /时间并回车。然后就进入了 at命令提示符,这时只需逐条输入相应的命令,然后按‘ <CTRL-D>’退出。下面给出一个例子:wangjian@wangjian-laptop:~$ at 12:59warning: commands will be executed using /bin/shat> find / -name "passwd" -printat> <EOT> at> <EOT>job 1 at Fri Aug 14 12:59:00 2009 其中, < E O T >就是< C T R L - D >。在2 1 : 1 0系统将执行一个简单的 f i n d命令。你应当已经注意到,我所提交的作业被分配了一个唯一标识 job 1。该命令在完成以后会将全部结果以邮件的形式发送给我。 下面就是我从这个邮件中截取的一部分: 下面这些日期/时间格式都是at命令可以接受的:At 6.45am May12At 11.10pmAt now + 1hourAt 9am tomorrowAt 15:00 May 24At now + 10minuutes 如果希望向at命令提交一个 shell脚本,使用其命令行方式即可。在提交脚本时使用 -f选项。$:at 3:00pm tomorrow -f /apps/bin/db_table.sh在上面的例子中,一个叫做 db_table.sh的脚本将在明天下午 3:00运行。还可以使用 echo命令向at命令提交作业:$:echo find /etc -name "passwd" -print |at now +1 minute3.2.2 列出所提交的作业 一个作业被提交后,可以使用 at -l 命令来列出所有的作业:wangjian@wangjian-laptop:~$ at -l2Fri Aug 14 12:45:00 2009 a wangjian1Fri Aug 14 12:59:00 2009 a wangjian 其中,第一行是作业标识,后面是作业运行的日期 /时间。最后一列 a代表a t。还可以使用a t q命令来完成同样的功能,它是 a t命令的一个链接。当提交一个作业后,它就被拷贝到/var/spool/at目录中,准备在要求的时间运行。3.2.3 清除一个作业 清除作业的命令格式为: 或a atrm [job no] t -r [job no] 要清除某个作业,首先要执行 at -l命令,以获取相应的作业标识,然后对该作业标识使用at -r 命令,清除该作业。 有些系统使用at-r [job no]命令清除作业。wangjian@wangjian-laptop:~$ at -l1Fri Aug 14 12:59:00 2009 a wangjianwangjian@wangjian-laptop:~$ atrm 1有些系统使用at-r [job no]命令清除作业。3.3 &
命令 当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。 该命令的一般形式为: 命令 & 为什么要在后台执行命令?因为当在后台执行命令时,可以继续使用你的终端做其他事情。

linux 命令教程

适合在后台运行的命令有 find、费时的打印作业、费时的排序及一些 shell脚本。在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。 不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中: command >out.file 2>&1 & 在上面的例子中,所有的标准输出和错误输出都将被重定向到一个叫做 out.file 的文件中。当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。3.3.1 向后台提交命令 现在我们运行一个 f i n d命令,查找名为“ s r m . c o n f”的文件,并把所有标准输出和错误输出重定向到一个叫作 find.dt的文件中:wangjian@wangjian-laptop:~$ find /etc -name "srm.conf" -print>find.dt 2>&1 &[1] 8675wangjian@wangjian-laptop:~$ 在上面的例子中,在我们成功提交该命令之后,系统给出了它的进程号 86753.3.2 用ps命令查看进程 当一个命令在后台执行的时候,可以用提交命令时所得到的进程号来监控它的运行。在前面的例子中,我们可以按照提交 ps1时得到的进程号,用 ps命令和grep命令列出这个进程:wangjian@wangjian-laptop:~$ ps x|grep 6844 8683 pts/1 S+ 0:00 grep 6844记住,在用 ps命令列出进程时,它无法确定该进程是运行在前台还是后台3.3.3 杀死后台进程 如果想杀死后台进程可以使用 k i l l命令。当一个进程被放到后台运行时, s h e l l会给出一个进程号,我们可以根据这个进程号,用 kill命令杀死该进程。该命令的基本形式为: kill -signal [process_number] 现在暂且不要考虑其中的各种不同信号;我们会在后面的章节对这一问题进行介绍。 在杀进程的时候,执行下面的命令 (你的进程号可能会不同 )并按回车键。系统将会给出相应的信息告诉用户进程已经被杀死。kill 5097 如果系统没有给出任何信息,告诉你进程已经被杀死,那么不妨等一会儿,也许系统正在杀该进程,如果还没有回应,就再执行另外一个 kill命令,这次带上一个信号选项:kill -9 5097 如果用上述方法提交了一个后台进程,那么在退出时该进程将会被终止。为了使后台进程能够在退出后继续运行,可以使用 nohup命令,下面我们就介绍这一命令。3.4 nohup命令 如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用
nohup命令。该命令可以在你退出帐户之后继续运行相应的进程。 Nohup就是不挂起的意思 (nohang up)。 该命令的一般形式为: nohup command &3.4.1 使用nohup命令提交作业 如果使用 n o h u p命令提交

linux 命令教程

作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件: nohup command > myout.file 2>&1 在上面的例子中,输出被重定向到 myout.file文件中。 让我们来看一个例子,验证一下在退出帐户后相应的作业是否能够继续运行。我们先提交一个名为 ps1的日志清除进程:wangjian@wangjian-laptop:~$ nohup ps 1 &[1] 8862nohup: 忽略输入并把输出追加到“nohup.out”wangjian@wangjian-laptop:~$ [1]+ Done nohup ps 1 现在退出该 shell,再重新登录,然后执行下面的命令:wangjian@wangjian-laptop:~$ ps x |grep ps1 8870 pts/1 S+ 0:00 grep ps1 我们看到,该脚本还在运行。如果系统不支持 ps x 命令,使用 ps -ef|grep ps1命令。3.4.2 一次提交几个作业 如果希望一次提交几个命令,最好能够把它们写入到一个 s h e l l脚本文件中,并用 n o h u p命令来执行它。例如,下面的所有命令都用管道符号连接在一起;我们可以把这些命令存入一个文件,并使该文件可执行。$ cat /home/accounts/qtr_0499|apps/bin/trials.awk|sort|lp$:cat>quarterend现在让它可执行:$ chmod 744 quarterend我们还将该脚本的所有输出都重定向到一个名为 qtr.out的文件中。$:nohup ./quarterne>qtr.out 2>&1 &004 第4章 文件名置换 当你在使用命令行时,有很多时间都用来查找你所需要的文件。 S h e l l提供了一套完整的字符串模式匹配规则,或者称之为元字符,这样你就可以按照所要求的模式来匹配文件。还可以使用字符类型来匹配文件名。在命令行方式下,使用元字符更为快捷,所以在本章我们只介绍这部分内容。 在本章我们将讨论: 匹配文件名中的任何字符串。 匹配文件名中的单个字符。 匹配文件名中的字母或数字字符。 下面就是这些特殊字符: * 匹配文件名中的任何字符串,包括空字符串。 ? 匹配文件名中的任何单个字符。 [...] 匹配[ ]中所包含的任何字符。 [!...] 匹配[ ]中非感叹号!之后的字符。 当s h e l l遇到上述字符时,就会把它们当作特殊字符,而不是文件名中的普通字符,这样用户就可以用它们来匹配相应的文件名。4.1 使用* 使用星号*可以匹配文件名中的任何字符串。 在下面的例子中,我们给出文件名模式 w*,它的意思是文件名以 w开头,后面可以跟随任何字符串,包括空字符串:wangjian@wangjian-laptop:~$ ls w*wangjiancron~*也可以用在
文件名模式的开头,在下面的例子中, *.doc匹配所有以 .doc结尾的 文件名:ls *.docaccounts.doc *还可以用在文件名的当中,在下面的例子中, c l * . s e d用于匹配所有以 c l开头、后面跟任何字符串、最后以 .

linux 命令教程

sed结尾的文件名:ls cl*.sed 在使用 c d命令切换路径时,使用星号还可以省去输入整个路径名的麻烦,下面给出一个这样的例子:cd cron.w*4.2 使用? 使用可以匹配文件名中的任何单个字符。在下面的例子中,我们列出文件名以任意两个字符开头,接着是 t,后面跟任何字符的文件:wangjian@wangjian-laptop:~$ ls ??t*sexy 手机005 第5章 shell输入与输出 在shell脚本中,可以用几种不同的方式读入数据:可以使用标准输入 — 缺省为键盘,或者指定一个文件作为输入。对于输出也是一样:如果不指定某个文件作为输出,标准输出总是和终端屏幕相关联。如果所使用命令出现了什么错误,它也会缺省输出到屏幕上,如果不想把这些信息输出到屏幕上,也可以把这些信息指定到一个文件中。 大多数使用标准输入的命令都指定一个文件作为标准输入。如果能够从一个文件中读取数据,何必要费时费力地从键盘输入呢? 本章我们将讨论以下内容: 使用标准输入、标准输出及标准错误。 重定向标准输入和标准输出。 本章全面讨论了 shell对数据和信息的标准输入、标准输出,对重定向也做了一定的介绍。5.1 echo 使用echo命令可以显示文本行或变量,或者把字符串输入到文件。它的一般形式为: echo string echo命令有很多功能,其中最常用的是下面几个: \c 不换行。 \f 进纸。 \t 跳格。 \n 换行。 如果希望提示符出现在输出的字符串之后,可以用:wangjian@wangjian-laptop:~$ echo "What is your name :\c"What is your name :上面的命令将会有如下的显示:What is your name :如果想在输出字符之后,让光标移到下一行,可以用:echo "The red pen ran out of ink" 还可以用 e c h o命令输出转义符以及变量。在下面的例子中,你可以让终端铃响一声,显示出$ H O M E目录,并且可以让系统执行 t t y命令(注意,该命令用键盘左上角的符号,法语中的抑音符引起来,不是单引号, )。 echo "\007your home directory is $HOME, , you are connected on `tty`"\007your home directory is $HOME , you are connected on /dev/pts/0如果是LINUX系统,那么......必须使用- n选项来禁止echo命令输出后换行:$ echo -n "What is your name :"What is your name:wangjian@wangjian-laptop:~$ 必须使用-e选项才能使转义符生效:wangjian@wangjian-laptop:~$ echo -e "\007your home directory is $HOME , you are connected on `tty`"your home directory is /home/wangjian , you are connected on /dev/pts/0如果希望在 echo命令输出之后附加换行,可以使用 \n选项:wangjian@wangjian-lapto
p:~$ echo -e "this echo's 3 nes lines \n\n\n"this echo's 3 nes lines wangjian@wangjian-laptop:~$ 还可以在echo语句中使用跳格符,记住别忘了加反斜杠 \:

linux 命令教程

wangjian@wangjian-laptop:~$ echo -e "here is a tab\there are two tabs\t\tok"here is a tabhere are two tabsok 如果想把一个字符串输出到文件中,使用重定向符号 >。在下面的例子中一个字符串被重定向到一个名为 myfile的文件中: wangjian@wangjian-laptop:~$ echo "The log files have all been done"> myfie 或者可以追加到一个文件的末尾,这意味着不覆盖原有的内容: $ echo "$LOGNAME carried them out at `date`">>myfile 现在让我们看一下 myfile文件中的内容:wangjian@wangjian-laptop:~$ cat myfie The log files have all been donewangjian carried them out at 2009年 08月 21日 星期五 22:32:35 CST 初涉s h e l l的用户常常会遇到的一个问题就是如何把双引号包含到 e c h o命令的字符串中。引号是一个特殊字符,所以必须要使用反斜杠 \来使s h e l l忽略它的特殊含义。假设你希望使用 “/ ,那么我们只要在引号前面加上反斜杠 \即可:echo命令输出这样的字符串: dev/rmt0” $ echo "\"/dev/rmt0"\" "/dev/rmt0"5.2 read 可以使用read语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。如果只指定了一个变量,那么 r e a d将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回车。 它的一般形式为: read varible1 varible2 ... 在下面的例子中,只指定了一个变量,它将被赋予直至回车之前的所有内容:wangjian@wangjian-laptop:~$ read nameHello I am supermanwangjian@wangjian-laptop:~$ echo $nameHello I am superman 在下面的例子中,我们给出了两个变量,它们分别被赋予名字和姓氏。 s h e l l将用空格作为变量之间的分隔符:wangjian@wangjian-laptop:~$ read name surnameJohn Doewangjian@wangjian-laptop:~$ echo $name $surnameJohn Doe 如果输入文本域过长, Shell 将所有的超长部分赋予最后一个变量。下面的例子,假定要读取变量名字和姓,但这次输入三个名字;结果如下;wangjian@wangjian-laptop:~$ read name surnameJohn Lemon Doewangjian@wangjian-laptop:~$ echo $nameJohnwangjian@wangjian-laptop:~$ echo $surname Lemon Doe 在上面的例子中,如果我们输入字符串 John Lemon Doe,那么第一个单词将被赋给第一个变量,而由于变量数少于单词数,字符串后面的部分将被全部赋给第二个变量。 在编写shell脚本的时候,如果担心用户会对此感到迷惑,可以采用每一个 read语句只给一个变量赋值的办法:#!/bin/bash#var_testecho "First Name: \c"read name echo "Middle Name:\c"read middle echo "Last name: \c"read surname用户在运行上面这个脚本的时候,就能够知道哪些信息
赋给了哪个变量。wangjian@wangjian-laptop:~$ sh var_testFirst Name: JohnMiddle Name:LemonLast name: Doe5.3 cat c a t是一个简单而通用的命令,可以用它来显示文件内容,创

linux 命令教程

建文件,还可以用它来显示控制字符。在使用 c a t命令时要注意,它不会在文件分页符处停下来;它会一下显示完整个文件。如果希望每次显示一页,可以使用 m o r e命令或把 c a t命令的输出通过管道传递到另外一个具有分页功能的命令中,请看下面的例子:wangjian@wangjian-laptop:~$ cat myfie | moreThe log files have all been donewangjian carried them out at 2009年 08月 21日 星期五 22:32:35 CSTcat命令的一般形式为:cat [options] filename1 ... filename2 ...cat命令最有用的选项就是:-v 显示控制字符如果希望显示名为 myfile的文件,可以用:wangjian@wangjian-laptop:~$ cat myfie The log files have all been donewangjian carried them out at 2009年 08月 21日 星期五 22:32:35 CST 如果希望显示myfile1、myfile2、myfile3这三个文件,可以用: $ cat myfile1 myfile2 myfile3 如果希望创建一个名为 bigfile的文件,该文件包含上述三个文件的内容,可以把上面命令的输出重定向到新文件中: $ cat myfile1 myfile2 myfile3 > bigfile 如果希望创建一个新文件,并向其中输入一些内容,只需使用 c a t命令把标准输出重定向到该文件中,这时 c a t命令的输入是标准输入 — 键盘,你输入一些文字,输入完毕后按<CTRL-D>结束输入。这真是一个非常简单的文字编辑器!This is great wangjian@wangjian-laptop:~$ cat >myfileThis is greatwangjian@wangjian-laptop:~$ cat myfile This is great 有一点要提醒的是,如果在敲入了 c a t以后就直接按回车,该命令会等你输入字符。如果你本来就是要输入一些字符,那么它除了会在你输入时在屏幕上显示以外,还会再回显这些内容;最后按<CTRL-D>结束输入即可。5.4 管道 可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠 |表示。它的一般形式为: 命令1 |命令2 其中|是管道符号。 在下面的例子中,在当前目录中执行文件列表操作,如果没有管道的话,所有文件就会显示出来。当 s h e l l看到管道符号以后,就会把所有列出的文件交给管道右边的命令,因此管道的含义正如它的名字所暗示的那样:把信息从一端传送到另外一端。在这个例子中,接下来grep命令在文件列表中搜索 file:wangjian@wangjian-laptop:~$ ls -l |grep file-rw-r--r-- 1 wangjian wangjian 271 2009-08-21 22:53 bigfiledrwxr-xr-x 3 wangjian wangjian 4096 2009-08-11 15:23 file-rw-r--r-- 1 wangjian wangjian 14 2009-08-21 22:56 myfilewangjian@wangjian-laptop:~$ 如果你希望列出系统中所有的文件系统,可以使用管道把 d f命令的输出传递给 a w k命令,a w k显示出其中的第
一列。你还可以再次使用管道把 a w k的结果传递给 g r e p命令,去掉最上面的题头filesystem。wangjian@wangjian-laptop:~$ df -k | awk '{print $1}' |grep -v "Filesystem"文

linux 命令教程

件系统/dev/sda7tmpfsvarrunvarlockudevtmpfslrm/dev/sda6/dev/sda9/dev/sda3/dev/sda2 当然,你没准还会希望只显示出其中的分区名,不显示 / d e v /部分,这没问题;我们只要在后面简单地加上另一个管道符号和相应的 sed命令即可。wangjian@wangjian-laptop:~$ df -k | awk '{print $1}' |grep -v "Filesystem"|sed s'/\/dev\///g'文件系统sda7tmpfsvarrunvarlockudevtmpfslrmsda6sda9sda3sda25.5 tee t e e命令作用可以用字母 T来形象地表示。它把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。如果希望在看到输出的同时,也将其存入一个文件,那么这个命令再合适不过了。 它的一般形式为: tee -a files 其中,-a表示追加到文件末尾。 当执行某些命令或脚本时,如果希望把输出保存下来, tee命令非常方便。 下面我们来看一个例子,我们使用 w h o命令,结果输出到屏幕上,同时保存在 w h o . o u t文件中:wangjian@wangjian-laptop:~$ who |tee who.outwangjian tty1 2009-08-21 22:16wangjian tty7 2009-08-21 21:12 (:0)wangjian pts/0 2009-08-21 22:18 (:0.0)wangjian@wangjian-laptop:~$ cat who.out wangjian tty1 2009-08-21 22:16wangjian tty7 2009-08-21 21:12 (:0)wangjian pts/0 2009-08-21 22:18 (:0.0)可以在执行脚本之前,使用一个 e c h o命令告诉用户谁在执行这个脚本,输出结果保存在什么地方。wangjian@wangjian-laptop:~$ echo "var_test is now running,check out any errors... in myscript.log |tee -a var_test.log> wangjian@wangjian-laptop:~$ sh var_test |tee -a var_test.logFirst Name: wangMiddle Name:jinLast name: jianfullname : wang jin jianwangjian@wangjian-laptop:~$ cat var_test.log First Name: Middle Name:Last name: fullname : wang jin jian5.6 标准输入、输出和错误 当我们在 s h e l l中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆, shell同时也给出了相应的文件名。 下面就是这些文件描述符及它们通常所对应的文件名: 文 件 文件描述符 输入文件 — 标准输入 0 输出文件 — 标准输出 1 错误输出文件 — 标准错误 2 系统中实际上有 12个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、输出和错误。可以任意使用文件描述符 3到9。5.6.1 标准输
入 标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。5.6.2 标准输出 标准输出是文件描述符 1。它是命令的输出,缺省是屏幕,也可以是文件。5.6.3 标准错误 标准错误是文件描述符 2。这是命令错误的输出,缺省是屏幕

linux 命令教程

,同样也可以是文件。你可能会问,为什么会有一个专门针对错误的特殊文件?这是由于很多人喜欢把错误单独保存到一个文件中,特别是在处理大的数据文件时,可能会产生很多错误。 如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说是你的终端) 。5.7 文件重定向 在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件重定向。表 5-1列出了最常用的重定向组合,并给出了相应的文件描述符。 在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,这不是必需的。为了完整起见,我们在表 5-1中列出了两种方法。 表5-1 常用文件重定向命令 把把标准输出重定向到一个新文件中command > filename 把把标准输出重定向到一个文件中 (追加)command >> filename 把把标准输出重定向到一个文件中command 1 > fielname 把把标准输出和标准错误一起重定向到一个文件中command > filename 2>&1 把把标准错误重定向到一个文件中command 2 > filename 把把标准输出重定向到一个文件中 (追加)command 2 >> filename 把把标准输出和标准错误一起重定向到一个文件中 (追加)command >> filename 2>&1 把c o m m a n d命令以 f i l e n a m e文件作为标准输入,以 f i l e n a m e 2文件command < filename >filename2 作为标准输出 把command命令以filename文件作为标准输入command < filename 把从标准输入中读入,直至遇到 delimiter分界符command << delimiter 把把文件描述符 m作为标准输入command <&m 把把标准输出重定向到文件描述符 m中command >&m 把关闭标准输入command <&-5.7.1 重定向标准输出 让我们来看一个标准输出的例子。在下面的命令中,把 / e t c / p a s s w d文件中的用户 I D域按照用户命排列。该命令的输出重定向到 sort.out文件中。要提醒注意的是,在使用 sort命令的时候(或其他含有相似输入文件参数的命令 ),重定向符号一定要离开 s o r t命令两个空格,否则该命令会把它当作输入文件。 $ cat passwd | awk -F: '{print $1}'
| sort 1>sort.out 从表5-1中可以看出,我们也可以使用如下的表达方式,结果和上面一样: $ cat passwd | awk -F: '{print $1}' | sort >sort.out 可以把很多命令的输出追加到同一文件

linux 命令教程

中。wangjian@wangjian-laptop:~$ ls -l |grep ^d >>bigfilewangjian@wangjian-laptop:~$ cat bigfile The log files have all been donewangjian carried them out at 2009年 08月 21日 星期五 22:32:35 CST#!/bin/bash#var_testecho "First Name: \c"read name echo "Middle Name:\c"read middle echo "Last name: \c"read surnameecho fullname : $name $middle $surnamedrwxr-xr-x 3 wangjian wangjian 4096 2009-08-11 15:23 filedrwxr-xr-x 2 wangjian wangjian 4096 2009-08-10 08:09 moduledrwxr-xr-x 5 wangjian wangjian 4096 2009-08-10 00:46 musicdrwxr-xr-x 4 wangjian wangjian 4096 2009-08-16 23:36 pituredrwxr-xr-x 4 wangjian wangjian 4096 2009-08-12 16:17 Programsdrwxr-xr-x 2 wangjian wangjian 4096 2009-08-10 08:09 publicdrwxr-xr-x 2 wangjian wangjian 4096 2009-08-10 08:09 vediodrwxr-xr-x 3 wangjian wangjian 4096 2009-08-21 23:20 桌面 如果希望把标准输出重定向到文件中,可以用 > f i l e n a m e。在下面的例子中, l s命令的所有输出都被重定向到 ls.out文件中: $ ls >ls.out 如果希望追加到已有的文件中 (在该文件不存在的情况下创建该文件 ),那么可以使用>>filename:wangjian@wangjian-laptop:~$ pwd >>path.outwangjian@wangjian-laptop:~$ lsbigfile module myfile Programs var_test~ who.outfile music path.out public var_test.log 桌面ls.out myfie piture var_test vediowangjian@wangjian-laptop:~$ cat path.out /home/wangjian如果想创建一个长度为 0的空文件,可以用 '>filename':wangjian@wangjian-laptop:~$ >myfile5.7.2 重定向标准输入 可以指定命令的标准输入。在 awk一章就会遇到这样的情况。下面给出一个这样的例子: $ sort < name.txt 在上面的命令中, s o r t命令的输入是采用重定向的方式给出的,不过也可以直接把相应的文件作为该命令的参数: $ sort name.txt 在上面的例子中,还可以更进一步地通过重定向为 s o r t命令指定一个输出文件 n a m e . o u t。wangjian@wangjian-laptop:~$ sort < ls.out bigfilefilels.outmodulemusicmyfiemyfilepitureProgramspublicvar_testvar_test~var_test.logvediowho.out桌面wangjian@wangjian-laptop:~$ sort ls.out bigfilefilels.outmodulemusicmyfiemyfilepitureProgramspublicvar_testvar_test~var_test.logvediowho.out桌面这样屏幕上将不会出现任何信息 (除了错误信息以外 ): $ sort <name.txt >name.out 在发送邮件时,可以用重定向的方法发送一个文件中的内容。在下面的例子中,用户louise将收到一个邮件,其中含有文件 contents.txt中的内容: $ mail louise < contents
.txt 重定向操作符command << delimiter是一种非常有用的命令,通常都被称为“此处”文挡。我们将在本书后面的章节深入讨论这一问题。现在只介绍它的功能。 shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇

本文来源:https://www.bwwdw.com/article/kpr1.html

Top