对话 UNIX: !$#@*%

对话 UNIX: !$#@*%学习更多的命令行技巧和操作符更好地理解 UNIX® 用户输入的这些 “奇怪的” 字符。学习如何在 UNIX 中使用管道、重定向、操作符等特性。

现在,您已经在 IBM® AIX® 上工作了一段时间了。您已经学习了几个基本命令,能够在目录结构中移动、创建和修改文件、查看正在运行的进程以及管理用户和系统。这很不错,但是您希望了解 UNIX® 管理员输入的命令是什么意思。这些命令中包含许多奇怪的符号。在本文中,了解 |、>、>>、<、<<、[[ 和 ]] 等符号在 UNIX 和 Linux® 中的意思,以及如何使用 &&、||、<、<= 和 != 操作符。

管道

如果您熟悉 UNIX,那么管道(或 pipe)会是每天都要接触到的东西。管道最初是由 Malcolm McIlroy 开发的,可以使用管道把一个命令的标准输出(stdout)定向到下一个命令的标准输入(stdin),这样就形成了连续执行的命令链。可以在一个命令行上使用多个管道。在许多时候,一个命令的 stdout 用作下一个命令的 stdin,第二个命令的 stdout 又被重定向到另一个命令的 stdin,依此类推。

例如,在排除故障或执行日常检查时,大多数 UNIX 管理员首先做的事情之一是查看系统上当前正在运行的进程。清单 1 演示这样的检查。

清单 1. 日常进程检查示例

# ps –efUIDPID PPID C STIME TTY TIME CMDroot10 0 Jul 27- 0:05 /etc/initroot 53442 151674 0 Jul 27- 0:00 /usr/sbin/syslogdroot 574261 0 Jul 27- 0:00 /usr/lib/errdemonroot 615101 0 Jul 27- 23:55 /usr/sbin/syncd 60root 656341 0 Jul 27- 0:00 /usr/ccs/bin/shlap64root 82002 110652 0 Jul 27- 0:24 /usr/lpp/X11/bin/X -x abx-x dbe -x GLX -D /usr/lib/X11//rgb -T -force :0 -auth /var/dt/A:0-SfIdMaroot 861021 0 Jul 27- 0:00 /usr/lib/methods/ssa_daemon -l ssa0root 106538 151674 0 Jul 27- 0:01 sendmail: accepting connectionsroot 1106521 0 Jul 27- 0:00 /usr/dt/bin/dtlogin -daemonroot 114754 118854 0 Jul 27- 20:22 dtgreetroot 118854 110652 0 Jul 27- 0:00 dtlogin <:0>-daemonroot 1310881 0 Jul 27- 0:07 /usr/atria/etc/lockmgr-a /var/adm/atria/almd -q 1024 -u 256 -f 256root 1475841 0 Jul 27- 0:01 /usr/sbin/cronroot 155816 151674 0 Jul 27- 0:04 /usr/sbin/portmaproot 163968 151674 0 Jul 27- 0:00 /usr/sbin/qdaemonroot 168018 151674 0 Jul 27- 0:00 /usr/sbin/inetdroot 172116 151674 0 Jul 27- 0:03 /usr/sbin/xntpdroot 180314 151674 0 Jul 27- 0:19 /usr/sbin/snmpmibdroot 184414 151674 0 Jul 27- 0:21 /usr/sbin/aixmibdroot 188512 151674 0 Jul 27- 0:20 /usr/sbin/hostmibdroot 192608 151674 0 Jul 27- 7:46 /usr/sbin/muxatmdroot 196718 151674 0 11:00:27- 0:00 /usr/sbin/rpc.mountdroot 200818 151674 0 Jul 27- 0:00 /usr/sbin/biod 6root 213108 151674 0 Jul 27- 0:00 /usr/sbin/nfsd 3891root 221304 245894 0 Jul 27- 0:05 /bin/nsrexecd daemon 225402 151674 0 11:00:27- 0:00 /usr/sbin/rpc.statdroot 229498 151674 0 11:00:27- 0:00 /usr/sbin/rpc.lockdroot 241794 151674 0 Jul 27- 0:51 /usr/lib/netsvc/yp/ypbindroot 2458941 0 Jul 27- 0:00 /bin/nsrexecdroot 2539601 0 Jul 27- 0:00 ./mflm_managerroot 274568 151674 0 Jul 27- 0:00 /usr/sbin/sshd -Droot 2827661 0 Jul 27 lft0 0:00 /usr/sbin/getty /dev/consoleroot 2909581 0 Jul 27- 0:00 /usr/lpp/diagnostics/bin/diagdroot 315646 151674 0 Jul 27- 0:00 /usr/sbin/lpdroot 3196641 0 Jul 27- 0:00 /usr/atria/etc/albd_serverroot 340144 168018 0 12:34:56- 0:00 rpc.ttdbserver 100083 1root 376846 168018 0 Jul 30- 0:00 rlogind cormany 409708 569522 0 19:29:27 pts/1 0:00 -kshroot 569522 168018 0 19:29:26- 0:00 rlogind cormany 733188 409708 3 19:30:34 pts/1 0:00 ps -efroot 749668 168018 0 Jul 30- 0:00 rlogind

系统上当前正在运行的进程的列表可能像 清单 1 这么简单;但是,大多数生产系统运行的进程更多,这会使 ps 的输出更长。为了把这个列表缩短到自己需要的范围,可以使用管道把 ps –ef 的标准输出重定向到 grep,从而搜索自己真正希望看到的结果。清单 2 把 清单 1 产生的进程列表重定向到 grep,搜索字符串 “rpc” 和 “ksh”。

清单 2. 把进程列表重定向到 grep

# ps –ef | grep –E “rpc|ksh”root 196718 151674 0 11:00:27- 0:00 /usr/sbin/rpc.mountd daemon 225402 151674 0 11:00:27- 0:00 /usr/sbin/rpc.statdroot 229498 151674 0 11:00:27- 0:00 /usr/sbin/rpc.lockdroot 340144 168018 0 12:34:56- 0:00 rpc.ttdbserver 100083 1 cormany 409708 569522 0 19:29:27 pts/1 0:00 -ksh cormany 733202 409708 0 19:52:20 pts/1 0:00 grep -E rpc|ksh

当多次把 stdout 重定向到 stdin 时,管道的使用方法可以很复杂。在下面的示例中,扩展了前面的 ps 和 grep 示例,把它的 stdout 重定向到另一个 grep,其作用是排除包含 “grep” 或 “ttdbserver” 的字符串。当最后的 grep 操作完成时,再次使用管道把 stdout 重定向到一个 awk 语句,其作用是输出进程标识符(PID)大于 200,000 的所有进程:

# ps –ef | grep –E “rpc|ksh” | grep -vE “grep|rpc.ttdbserver” |awk -v _MAX_PID=200000 ‘{if ($2 > _MAX_PID) {print “PID forprocess”,$8,”is greater than”, _MAX_PID}}’PID for process /usr/sbin/rpc.statd is greater than 200000PID for process /usr/sbin/rpc.lockd is greater than 200000PID for process -ksh is greater than 200000

图 1 通过图形说明命令的 stdout 重定向到后续命令的 stdin 的次序。

图 1. 管道示例

回页首

用 >、>>、< 和 << 执行数据重定向获得幸福的二法门是珍惜你所拥有的、遗忘你所没有的

对话 UNIX: !$#@*%

相关文章:

你感兴趣的文章:

标签云: