从 Windows 环境向 Unix 系统传输文件时,最常见的问题就是每行末尾会多出一个“^M”字符。这实际上是 DOS/Windows 格式的换行符(CRLF)在 Unix 下未被正确转换造成的。有两种解决办法:如果已经用 vi 打开了文件,在命令模式下输入 :%s/^V^M//g 即可批量清除;如果不想进入编辑器,直接在 shell 里使用 sed 命令 sed 's/^V^M//g' foo > foo.new 也能实现相同效果。注意这里的“^V”是按 Ctrl+V 键,“^M”是按 Ctrl+M 键。
另一个容易踩坑的场景是文件名以减号开头,例如 -filename。直接执行 rm -filename 会被系统错误地解释为参数。正确的做法是用 rm -- "-filename",双横线告诉命令后面的内容不再视为选项。
系统挂载表是日常运维中必须掌握的内容。一个典型的 /etc/vfstab 文件(或 /etc/fstab)内容如下:
/dev/dsk/c0t3d0s0 /dev/rdsk/c0t3d0s0 / ufs 1 no -
/dev/dsk/c0t0d0s3 /dev/rdsk/c0t0d0s3 /usr ufs 1 no -
/dev/dsk/c0t0d0s0 /dev/rdsk/c0t0d0s0 /download ufs 2 yes -
/dev/dsk/c0t3d0s1 /dev/rdsk/c0t3d0s1 /export ufs 2 yes -
#/dev/dsk/c0t0d0s1 - - swap - no -
#swap - /tmp tmpfs - yes -
其中被注释掉的 swap 和 tmpfs 行,可以根据实际需求取消注释,从而启用交换分区和临时文件系统。
说到文件列表,ls 有不少实用的变体。ls -R 递归显示所有子目录内容,效果等同于 ls *。ls -t 按修改时间排序。如果想统计当前目录下有多少个文件和目录,可以用:
ls -l * | grep "^-" | wc -l # 统计文件数
ls -l * | grep "^d" | wc -l # 统计目录数
这些命令甚至可以编写成脚本或设置成别名(alias)以便复用。只列出子目录的方法也很简单:ls -F | grep /$(Linux),或者 ls -l | grep "^d"(Solaris)。
文本搜索离不开 grep 命令。grep user1 /etc/passwd 进行精确匹配,加上 -i 参数则忽略大小写。别名可以帮助简化重复操作,比如 alias find1 'find . -name \!* -print' 就能快速创建一个自定义的查找命令。
find 命令更是文件管理的利器。find . -ctime 0 -print 会列出当天修改过的所有文件。find . -name '*.bak' -exec rm {} \; 则能一次性删除所有备份文件。如果想查找7天前修改的 txt 文件,用 find . \( -name *.txt -ctime 7 \) -print。配合 -exec chown 还能批量修改文件所有权:Solaris 下用 find . -exec chown OWNER.[GROUP] {} \;,Linux 下加 -R 参数。
cut 命令可以按字段或字符列截取文本。cut -f field_list file 默认以逗号或空格分隔,cut -d: -f5,7-9 mydata 则以冒号为分隔符提取指定字段。cut -s -c35-40 mydata 按字符列截取,加上 -s 跳过注释行。
如果你只想列出当前目录下除了某种类型之外的所有文件,Ksh 环境下可以用 ls !(*.Z) 排除 .Z 文件。这个技巧在文件类型混杂时特别实用。
提示符也可以按个人喜好定制:PS1='newprompt' 然后 export PS1,或者用 set prompt='user1[\!]',其中的 \! 会显示命令历史编号。
添加新的 PATH 路径而不影响原有内容:PATH=$PATH:$HOME/bin:/.../... 再 export PATH 即可。想快速了解某个主题相关的所有命令,用 apropos lp 就能列出所有与打印机相关的命令。查看系统版本信息用 uname -a。
整个目录的拷贝,cp -r /home/baoshan/zzy . 就能把远程目录复制到当前路径。不同系统间的文件格式转换,unix2dos oldfile newfile 和 dos2unix oldfile newfile 是最直接的方法。检查已安装的软件包用 pkginfo,查看目录下所有文件占用空间用 du -d /。
文件加密可以使用 crypt:crypt passwd < myfile > newfile 压缩加密,然后删除原文件。需要恢复时执行 crypt passwd < newfile 即可。
关于前面提到的 ^M 字符,除了 vi 和 sed 的方法,通过 FTP 传输时选择 ASCII 模式也能从根源上避免这个问题。
想让后台任务在退出系统后继续运行,记得使用 nohup tar -cf /dev/tape /home &。重新登录后用 ps 就能看到进程仍在执行。
查看文件内容也有不少技巧。只看前5行用 head -5 /etc/passwd,只看后10行用 tail -10 /etc/passwd。想看中间某段,sed -n '5,10p' /etc/passwd 能直接输出第5到第10行。
磁盘空间检查,df -k 以 KB 为单位显示,df -t 则显示文件系统类型。超级用户修改系统时间可以使用 date MMDDHHMI 或 date -u MMDDHHMIYYYY。修改普通用户的口令,passwd -d user1 会直接删除该用户的口令(不推荐在生产环境使用)。
