4/30/2007

VirtualBox 使用记录

  1. 安装
    1. 安装:下载最新的deb包并安装,基本不会有什么问题。
    2. 权限:添加用户到vbox组,usermod -aG vboxusers yourusername
    3. 配置:创建虚拟机winxp,创建虚拟硬盘.dvi文件,我给了10G(我的硬盘较大),虚拟内存默认192M,虚拟显存16M。配置其他选项Alsa等。
    4. 安装winxp:推荐deepxp
    5. 安装附件:进入xp后,install guest Addition 包括虚拟显卡驱动等。很重要的,不安装就不能与host共享文件。
  2. 共享文件
    1. 安装vbox共享GUI:VBoxShareFolder,在host机上add文件夹,名称xxx后,在客机映射网络磁盘 \\vboxsvr\xxx 。 映射完后发现总是系统崩溃。在网上查到不少人说共享ext分区会有这个bug,我共享的fat32分区的文件,还是有这个问题。试了重装系统,但之后每次找到共享文件夹都会提示输入用户名和密码,但输入什么都在再不去了。
    2. ftp方式:主机安装vsftpd,配置/etc/vsftpd.conf 修改local_enable=yes,write_enable=yes,chroot_list_enable=yes restart vsftpd后,建立虚拟目录的软链接到用户目录,注意虚拟目录本身的权限。 客户机使用ftp上传下载
    3. samba方式:还没成功过。
  3. 安装软件
    1. qq:须删掉npkcrypt.sys登录时用模拟键盘输入密码
    2. 卡巴斯基:不能安装,装后系统总cpu100%而无反应,换用nod32后问题解决。
  4. 快照: 装好操作系统和必要软件时。注意保存部分系统完好的快照。 有些兄弟不装杀毒软件,每次中毒后用快照恢复

Linux系统下C语音编程

  这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容:   源程序编译   Makefile的编写   程序库的链接   程序的调试   头文件和系统求助   1.源程序的编译   在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器.     假设我们有下面一个非常简单的源程序(hello.c):     int main(int argc,char **argv)     {     printf("Hello Linux\n");     }   要编译这个程序,我们只要在命令行下执行:   gcc -o hello hello.c   gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出结果了.命令行中 gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件.   gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息.   知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.   2.Makefile的编写     假设我们有下面这样的一个程序,源代码如下:     /* main.c */     #include "mytool1.h"     #include "mytool2.h"     int main(int argc,char **argv)     {     mytool1_print("hello");     mytool2_print("hello");     }     /* mytool1.h */     #ifndef _MYTOOL_1_H     #define _MYTOOL_1_H     void mytool1_print(char *print_str);     #endif     /* mytool1.c */     #include "mytool1.h"     void mytool1_print(char *print_str)     {      printf("This is mytool1 print %s\n",print_str);     }     /* mytool2.h */     #ifndef _MYTOOL_2_H     #define _MYTOOL_2_H     void mytool2_print(char *print_str);     #endif     /* mytool2.c */     #include "mytool2.h"     void mytool2_print(char *print_str)     {      printf("This is mytool2 print %s\n",print_str);     }   当然由于这个程序是很短的我们可以这样来编译   gcc -c main.c   gcc -c mytool1.c   gcc -c mytool2.c   gcc -o main main.o mytool1.o mytool2.o   这样的话我们也可以产生main程序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了.是的对于这个程序来说,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译?   为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们只要执行以下make,就可以把上面的问题解决掉.在我们执行make之前,我们要先编写一个非常重要的文件.--Makefile.对于上面的那个程序来说,可能的一个Makefile的文件是:     # 这是上面那个程序的Makefile文件     main:main.o mytool1.o mytool2.o     gcc -o main main.o mytool1.o mytool2.o     main.o:main.c mytool1.h mytool2.h     gcc -c main.c     mytool1.o:mytool1.c mytool1.h     gcc -c mytool1.c     mytool2.o:mytool2.c mytool2.h     gcc -c mytool2.c   有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的.   下面我们学习Makefile是如何编写的.   在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明.一般的格式是:   target: components   TAB rule      第一行表示的是依赖关系.第二行是规则.   比如说我们上面的那个Makefile文件的第二行   main:main.o mytool1.o mytool2.o   表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o 当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上面那个Makefile第三行所说的一样要执行 gcc - o main main.o mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键Makefile有三个非常有用的变量.分别是$@,$^,$< 代表的意义分别是:   $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。   如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:     # 这是简化后的Makefile     main:main.o mytool1.o mytool2.o     gcc -o $@ $^     main.o:main.c mytool1.h mytool2.h     gcc -c $<     mytool1.o:mytool1.c mytool1.h     gcc -c $<     mytool2.o:mytool2.c mytool2.h     gcc -c $<   经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点.这里我们学习一个Makefile的缺省规则。     .c.o:     gcc -c $<   这个规则表示所有的 .o文件都是依赖与相应的.c文件的.例如mytool.o依赖于mytool.c这样Makefile还可以变为:     # 这是再一次简化后的Makefile     main:main.o mytool1.o mytool2.o     gcc -o $@ $^     .c.o:     gcc -c $<   好了,我们的Makefile 也差不多了,如果想知道更多的关于Makefile规则可以查看相应的文档.   3.程序库的链接   试着编译下面这个程序     /* temp.c */     #include     int main(int argc,char **argv)      {         double value;     printf("Value:%f\n",value);      }   这个程序相当简单,但是当我们用 gcc -o temp temp.c 编译时会出现下面所示的错误。     /tmp/cc33Kydu.o: In function `main':     /tmp/cc33Kydu.o(.text+0xe): undefined reference to `log'     collect2: ld returned 1 exit status   出现这个错误是因为编译器找不到log的具体实现.虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库.在Linux下,为了使用数学函数,我们必须和数学库连接,为此我们要加入 -lm 选项. gcc -o temp temp.c -lm这样才能够正确的编译.也许有人要问,前面我们用printf函数的时候怎么没有连接库呢?是这样的,对于一些常用的函数的实现,gcc编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的 -L选项指定路径.比如说我们有一个库在 /home/hoyt/mylib下,这样我们编译的时候还要加上 -L/home/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径/lib /usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径.   还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件 (libpthread.a). 当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只好用 nm - o /lib/*.sogrep sin>~/sin 命令,然后看~/sin文件,到那里面去找了. 在sin文件当中,我会找到这样的一行 libm-2.1.2.so:00009fa0 W sin 这样我就知道了sin在 libm-2.1.2.so库里面,我用 -lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是 -lm). 如果你知道怎么找,请赶快告诉我,我回非常感激的.谢谢!   4.程序的调试   我们编写的程序不太可能一次性就会成功的,在我们的程序当中,会出现许许多多我们想不到的错误,这个时候我们就要对我们的程序进行调试了.   最常用的调试软件是gdb.如果你想在图形界面下调试程序,那么你现在可以选择xxgdb.记得要在编译的时候加入 -g选项.关于gdb的使用可以看 gdb的帮助文件.由于我没有用过这个软件,所以我也不能够说出如何使用. 不过我不喜欢用gdb.跟踪一个程序是很烦的事情,我一般用在程序当中输出中间变量的值来调试程序的.当然你可以选择自己的办法,没有必要去学别人的.现在有了许多IDE环境,里面已经自己带了调试器了.你可以选择几个试一试找出自己喜欢的一个用.   5.头文件和系统求助   有时候我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记得着函数在那个头文件进行了说明.这个时候我们可以求助系统.   比如说我们想知道fread这个函数的确切形式,我们只要执行 man fread 系统就会输出着函数的详细解释的.和这个函数所在的头文件说明了. 如果我们要write这个函数的说明,当我们执行man write时,输出的结果却不是我们所需要的. 因为我们要的是write这个函数的说明,可是出来的却是write这个命令的说明.为了得到write的函数说明我们要用 man 2 write. 2表示我们用的write这个函数是系统调用函数,还有一个我们常用的是3表示函数是C的库函数.   记住不管什么时候,man都是我们的最好助手。

4/29/2007

在Ubuntu Feisty Fawn安装最新的nVIDIA驱动程序和Beryl

nVIIDA已经释出了他们9xxx系列驱动。这将允许Compiz/Beryl直接运行在X Server(Xorg 7.1)而不必选择Aiglx或Xgl。 注意:首先你需要移除所有已存在的Aiglx/Xgl。 准备你的系统: 你需要输入以下指令以确保系统是最新的: sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade 加入源列表 你需要编辑:/etc/apt/sources.list sudo vi /etc/apt/sources.list 加入下面的几行(i386&64位都是) deb http://ubuntu.beryl-project.org feisty main 保存文件并退出 在终端下输入 wget http://ubuntu.beryl-project.org/root@lupine.me.uk.gpg -O- sudo apt-key add - 接下来再输入升级 sudo apt-get update 在Ubuntu Feisty安装最新的nVIDIA驱动程序 分别在终端下输入 sudo apt-get install nvidia-glx sudo nvidia-xconfig --add-argb-glx-visuals --composite 安装好后,按ctrl+alt+backspace,重启X并登出 在Ubuntu Feisty里安装Beryl 在终端下输入 sudo apt-get install beryl emerald-themes 安装好后,在终端下输入或者在Alt+F2的运行框里输入 beryl-manager 就可以了,或者你可以加入会话的自动启动程序里

4/28/2007

Shell命令学习

强烈推荐 Shell Manual全书一共30章,359页 第一部分 Shell基础 第1章 文件安全与权限 {chmod chown chgrp umask 文件类型 权限位 用户与用户组} 第2章 使用find和xargs {find的name prune type 等选项以及exec ok 和xargs执行命令} 第3章 后台执行命令 {cron crontab at & nohup ps kill} 第4章 文件名置换 {模式匹配 *,?,[...],[!...]} 第5章 shell输入与输出 {echo,read,cat ,管道,tee,重定向,标准in/out/err,exec,文件描述符} 第6章 命令执行顺序 {&amp;&,,(),{},} 第二部分 文 本 过 滤 第7章 正则表达式介绍 第8章 grep 家 族 第9章 awk 介 绍 第10章 sed 介 绍 第11章 合并与分割 第12章 tr 用 法 第三部分 登 录 环 境 第13章 登 录 环 境 {/etc/profile,$HOME.profile,stty,.logout} 第14章 环境和shell变量 {本地变量,环境变量,位置变量} 第15章 引 号 {单引号,双引号,反引号,反斜线} 第四部分 基础shell编程 第16章 shell脚本介绍 第17章 条 件 测 试 {文件状态,字符串,数值,expr用法,增量测试} 第18章 控制流结构 {if then else,null,elif,case,for,until,while,break和continue} 第19章 shell 函 数 第20章 向脚本传递参数 {shift,getopts} 第21章 创建屏幕输出 {tput} 第22章 创建屏幕输入 第23章 调 试 脚 本 第24章 shell嵌入命令 {pwd,set,time,type,ulimit,wait} 第五部分 高级shell编程技巧 第25章 深入讨论<< 第26章 shell 工 具 {保存信息,信号,trap,eval,logger} 第27章 几个脚本例子 第28章 运行级别脚本 第29章 cgi 脚 本 第30章 常用shell命令

4/27/2007

Linux系统管理命令

wall命令   这个命令的功能是对全部已登录的用户发送信息,用户可以先把要发送的信息写好存入一个文件中,然后输入:   # wall < 文件名   这样就能对所有的用户发送信息了。   在上面的例子中符号"<"表示输入重定向,有关它的含义和用法请参阅第十章的有关内容。 例如:   # wall 'Thank you!'   Broadcast message from root (tty1) Fri Nov 26 14:15:07 1999…   Thank you!   #   执行以上命令后,用户的屏幕上显示出"Thank you!"信息后,并不出现系统提示符$(#),再次按回车键后,屏幕出现系统提示符。   write命令   write命令的功能是向系统中某一个用户发送信息。 该命令的一般格式为:   write 用户帐号 [终端名称]   例如: $ write Guest hello   此时系统进入发送信息状态,用户可以输入要发送的信息,输入完毕,希望退出发送状态时,按组合键< Ctrl+c>即可。   mesg指令   mesg命令设定是否允许其他用户用write命令给自己发送信息。如果允许别人给自己发送信息,输入命令:   # mesg y   否则,输入:   # mesg n   对于超级用户,系统的默认值为 n;而对于一般用户系统的默认值为y。 如果mesg后不带任何参数,则显示当前的状态是y还是n.。   sync命令   sync命令是在关闭Linux系统时使用的。 用户需要注意的是,不能用简单的关闭电源的方法关闭系统,因为Linux象其他Unix系统一样,在内存中缓存了许多数据,在关闭系统时需要进行内存数据与硬盘数据的同步校验,保证硬盘数据在关闭系统时是最新的,只有这样才能确保数据不会丢失。一般正常的关闭系统的过程是自动进行这些工作的,在系统运行过程中也会定时做这些工作,不需要用户干预。 sync命令是强制把内存中的数据写回硬盘,以免数据的丢失。用户可以在需要的时候使用此命令。该命令的一般格式为:   sync   shutdown命令   shutdown 命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告信息。该命令还允许用户指定一个时间参数,可以是一个精确的时间,也可以是从现在开始的一个时间段。精确时间的格式是hh:mm,表示小时和分钟;时间段由"+"和分钟数表示。系统执行该命令后,会自动进行数据同步的工作。   该命令的一般格式为: shutdown [选项] [时间] [警告信息] 命令中各选项的含义为:   - k 并不真正关机,而只是发出警告信息给所有用户。   - r 关机后立即重新启动。   - h 关机后不重新启动。   - f 快速关机,重启动时跳过fsck。   - n 快速关机,不经过init程序。   - c 取消一个已经运行的shutdown。   需要特别说明的是,该命令只能由超级用户使用   free命令   free命令的功能是查看当前系统内存的使用情况,它显示系统中剩余及已用的物理内存和交换内存,以及共享内存和被核心使用的缓冲区。   该命令的一般格式为: free [-b   -k   -m] 命令中各选项的含义如下:   -b 以字节为单位显示。   -k 以K字节为单位显示。   -m 以兆字节为单位显示。   uptime命令   uptime命令显示系统已经运行了多长时间,它依次显示下列信息:现在时间、系统已经运行了多长时间、目前有多少登录用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。   该命令的一般格式为: uptime

df命令   功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。   语法:df [选项]   说明:df命令可显示所有文件系统对i节点和磁盘块的使用情况。   该命令各个选项的含义如下:   -a 显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。   -k 以k字节为单位显示。   -i 显示i节点信息,而不是磁盘块。   -t 显示各指定类型的文件系统的磁盘空间使用情况。   -x 列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。   -T 显示文件系统类型。   du命令

du的英文原义为"disk usage",含义为显示磁盘空间的使用情况。   功能:统计目录(或文件)所占磁盘空间的大小。   语法:du [选项] [Names…]   说明:该命令逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出Names,则对当前目录进行统计。   该命令的各个选项含义如下:   -s 对每个Names参数只给出占用的数据块总数。   -a 递归地显示指定目录中各文件及子孙目录中各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。   -b 以字节为单位列出磁盘空间使用情况(系统缺省以k字节为单位)。   -k 以1024字节为单位列出磁盘空间使用情况。   -c 最后再加上一个总计(系统缺省设置)。   -l 计算所有的文件大小,对硬链接文件,则计算多次。   -x 跳过在不同文件系统上的目录不予统计。

dd命令   功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换。可以用该命令实现DOS下的diskcopy命令的作用。先用dd命令把软盘上的数据写成硬盘的一个寄存文件,再把这个寄存文件写入第二张软盘上,完成diskcopy的功能。需要注意的是,应该将硬盘上的寄存文件用rm命令删除掉。系统默认使用标准输入文件和标准输出文件。   语法:dd [选项]   if =输入文件(或设备名称)。   of =输出文件(或设备名称)。   ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。   skip = blocks 跳过读入缓冲区开头的ibs*blocks块。   obs = bytes 一次写入bytes字节,即写入缓冲区的字节数。   bs = bytes 同时设置读/写缓冲区的字节数(等于设置ibs和obs)。   cbs = byte 一次转换bytes字节。   count=blocks 只拷贝输入的blocks块。   conv = ASCII 把EBCDIC码转换为ASCIl码。   conv = ebcdic 把ASCIl码转换为EBCDIC码。   conv = ibm 把ASCIl码转换为alternate EBCDIC码。   conv = block 把变动位转换成固定字符。   conv = ublock 把固定位转换成变动位。   conv = ucase 把字母由小写转换为大写。   conv = lcase 把字母由大写转换为小写。   conv = notrunc 不截短输出文件。   conv = swab 交换每一对输入字节。   conv = noerror 出错时不停止处理。   conv = sync 把每个输入记录的大小都调到ibs的大小(用NUL填充)。   fdformat 命令   软盘是用户常用的存储介质之一。软盘在使用之前必须先作格式化操作,然后可以用tar、dd、cpio等命令存储数据,也可以在软盘上建立可安装的文件系统。   功能:低级格式化软盘   语法:format [-n] device   说明:该命令的作用是对软盘进行格式化。   -n 软盘格式化后不作检验。   device 指定要进行格式化的设备,通常是下述设备之一:   /dev/fd0d360   /dev/fd0h1200   /dev/fd0D360   /dev/fd0H360   /dev/fd0D720   /dev/fd0H720   /dev/fd0h360   /dev/fd0h720   /dev/fd0H1440   Linux其它命令   echo命令   echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。   该命令的一般格式为: echo [ -n ] 字符串   其中选项n表示输出文字后不换行;字符串可以加引号,也可以不加引号。用echo命令输出加引号的字符串时,将字符串原样输出;用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分割。   cal命令   cal命令的功能是显示某年某月的日历。   该命令的一般格式为: cal [选项] [月 [年]] 命令中各选项的含义为:   - j 显示出给定月中的每一天是一年中的第几天(从1月1日算起)。   - y 显示出整年的日历。

 date命令 :date命令的功能是显示和设置系统日期和时间。   格式: date [选项] 显示时间格式(以+开头,后面接格式)     命令中各选项的含义分别为:   -d datestr, --date datestr 显示由datestr描述的日期   -s datestr, --set datestr 设置datestr 描述的日期   -u, --universal 显示或设置通用时间   时间域   % H 小时(00..23)   % I 小时(01..12)   % k 小时(0..23)   % l 小时(1..12)   % M 分(00..59)   % p 显示出AM或PM   % r 时间(hh:mm:ss AM或PM),12小时  % T 时间(24小时制)(hh:mm:ss)   % s 从1970年1月1日00:00:00到目前经历的秒数   % S 秒(00..59)   % X 显示时间的格式(%H:%M:%S)   % x 显示日期的格式(mm/dd/yy)   % Z 时区 日期域   % a 星期几的简称( Sun..Sat)   % A 星期几的全称( Sunday..Saturday)   % b 月的简称(Jan..Dec)   % B 月的全称(January..December)   % c 日期和时间( Mon Nov 8 14:12:46 CST 1999)   % d 一个月的第几天(01..31)   % D 日期(mm/dd/yy)   % h 和%b选项相同   % j 一年的第几天(001..366)   % m 月(01..12)   % w 一个星期的第几天(0代表星期天)   % W 一年的第几个星期(00..53,星期一为第一天)   % y 年的最后两个数字( 1999则是99)   % Y 年(例如:1970,1996等)   注意:只有超级用户才有权限使用date命令设置时间,一般用户只能使用date命令显示时间。   clear命令   clear命令的功能是清除屏幕上的信息,它类似于DOS中的 cls命令。清屏后,提示符移动到屏幕左上角。

4/26/2007

uniq命令

  文件经过处理后在它的输出文件中可能会出现重复的行。例如,使用cat命令将两个文件合并后,再使用sort命令进行排序,就可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下每条记录的唯一样本。



  语法:   uniq [选项] 文件



  说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如果输入文件用"- "表示,则从标准输入读取。



  该命令各选项含义如下:



  - c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代- u和- d选项。



  - d 只显示重复行。



  - u 只显示文件中不重复的各行。



  - n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。



  +n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。



  - f n 与- n相同,这里n是字段数。



  - s n 与+n相同,这里n是字符数。

sort命令

  sort命令的功能是对文件中的各行进行排序,如果两行的首字符相同,该命令将继续比较这两行的下一字符。

  语法:   sort [选项] 文件

  说明:sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用"- ",则表示排序内容来自标准输入。

  sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。缺省情况下以整行为关键字按ASCII字符顺序进行排序。

  改变缺省设置的选项主要有:

  - m 若给定文件已排好序,合并文件。

  - c 检查给定文件是否已排好序,如果它们没有都排好序,则打印一个出错信息,并以状态值1退出。

  - u 对排序后认为相同的行只留其中一行。

  - o 输出文件 将排序输出写到输出文件中而不是标准输出,如果输出文件是输入文件之一,sort先将该文件的内容写入一个临时文件,然后再排序和写输出结果。

  改变缺省排序规则的选项主要有:

  - d 按字典顺序排序,比较时仅字母、数字、空格和制表符有意义。

  - f 将小写字母与大写字母同等对待。

  - I 忽略非打印字符。

  - r 按逆序输出排序结果。