也许你已经发现了前面关于Linux初级用户(刚接触Linux的用户)的20个命令非常有用。前面的那篇文章是为初学者准备,而这篇则是为有一定基础的中级用户准备。通过这篇文章你将了解到如何去自定义搜索,如何了解正在运行的进程并kill这些进程,另外就是了解Linux命令行的重要以及如何在类unix系统中编译C,C++,java程序。

  1. Find命令

    在指定的目录中从父目录开始逐级向下分层查询要查询的文件。

    root@belen:~# find -name *.sh 
    ./Desktop/load.sh 
    ./Desktop/test.sh 
    ./Desktop/shutdown.sh 
    ./Binary/firefox/run-mozilla.sh 
    ./Downloads/kdewebdev-3.5.8/quanta/scripts/externalpreview.sh 
    ./Downloads/kdewebdev-3.5.8/admin/doxygen.sh 
    ./Downloads/kdewebdev-3.5.8/admin/cvs.sh 
    ./Downloads/kdewebdev-3.5.8/admin/ltmain.sh 
    ./Downloads/wheezy-nv-install.sh 

    注意:”-name”是区分大小写的搜索。你可以使用”-iname”参数进行不区分大小写的搜索。(* 是一个通配符是搜索所有后缀名为’.sh’的文件)

    root@belen:~# find -iname *.SH ( find -iname *.Sh /  find -iname *.sH)
    ./Desktop/load.sh 
    ./Desktop/test.sh 
    ./Desktop/shutdown.sh 
    ./Binary/firefox/run-mozilla.sh 
    ./Downloads/kdewebdev-3.5.8/quanta/scripts/externalpreview.sh 
    ./Downloads/kdewebdev-3.5.8/admin/doxygen.sh 
    ./Downloads/kdewebdev-3.5.8/admin/cvs.sh 
    ./Downloads/kdewebdev-3.5.8/admin/ltmain.sh 
    ./Downloads/wheezy-nv-install.sh
    root@belen:~# find -name *.tar.gz 
    /var/www/modules/update/tests/aaa_update_test.tar.gz 
    ./var/cache/flashplugin-nonfree/install_flash_player_11_linux.i386.tar.gz 
    ./home/server/Downloads/drupal-7.22.tar.gz 
    ./home/server/Downloads/smtp-7.x-1.0.tar.gz 
    ./home/server/Downloads/noreqnewpass-7.x-1.2.tar.gz 
    ./usr/share/gettext/archive.git.tar.gz 
    ./usr/share/doc/apg/php.tar.gz 
    ./usr/share/doc/festival/examples/speech_pm_1.0.tar.gz 
    ./usr/share/doc/argyll/examples/spyder2.tar.gz 
    ./usr/share/usb_modeswitch/configPack.tar.gz        
**注意**:上面的命令是在root目录包括其下面所有子目录挂载的设备目录中搜索扩展名为"tar.gz"的文件。更多**find**相关命令,请查看。    

  1. grep命令

    “grep”命令在指定的文件中逐行匹配要搜索的字符。如:在”/etc/passwd”中搜索用户’belen’。

    root@belen:~# grep tecmint /etc/passwd 
    belen:x:1000:1000:Belen,,,:/home/belen:/bin/bash

    忽略字符大小写需要使用”-i”参数。

    root@belen:~# grep -i BELEN /etc/passwd 
    belen:x:1000:1000:Belen,,,:/home/belen:/bin/bash

    递归搜索使用参数”-r”,如:在指定目录中逐个目录搜索包含”127.0.0.1”。

    root@belen:~# grep -r "127.0.0.1" /etc/ 
    /etc/vlc/lua/http/.hosts:127.0.0.1
    /etc/speech-dispatcher/modules/ivona.conf:#IvonaServerHost "127.0.0.1"
    /etc/mysql/my.cnf:bind-address        = 127.0.0.1
    /etc/apache2/mods-available/status.conf:    Allow from 127.0.0.1 ::1
    /etc/apache2/mods-available/ldap.conf:    Allow from 127.0.0.1 ::1
    /etc/apache2/mods-available/info.conf:    Allow from 127.0.0.1 ::1
    /etc/apache2/mods-available/proxy_balancer.conf:#    Allow from 127.0.0.1 ::1
    /etc/security/access.conf:#+ : root : 127.0.0.1
    /etc/dhcp/dhclient.conf:#prepend domain-name-servers 127.0.0.1;
    /etc/dhcp/dhclient.conf:#  option domain-name-servers 127.0.0.1;
    /etc/init/network-interface.conf:    ifconfig lo 127.0.0.1 up || true
    /etc/java-6-openjdk/net.properties:# localhost & 127.0.0.1).
    /etc/java-6-openjdk/net.properties:# http.nonProxyHosts=localhost|127.0.0.1
    /etc/java-6-openjdk/net.properties:# localhost & 127.0.0.1).
    /etc/java-6-openjdk/net.properties:# ftp.nonProxyHosts=localhost|127.0.0.1
    /etc/hosts:127.0.0.1    localhost        

    注意:你还可以在grep命令后使用一下参数。

    -w 匹配单词(egrep -w ‘word1 | word2’ /path/to/file)在指定文件中匹配word1或者word2这两个单词。 -c 计数(grep -c ‘word’ /path/to/file)即在指定文件中出现’word’的次数 -color 着重色输出(grep -color server /etc/passwd)


  2. man命令

    ‘man’是系统自带的手册帮助也。Man为所有命令可以使用的参数提供在线帮助文档。比如:

    root@belen:~# man man
    
            MAN(1)
            Manual pager utils
            MAN(1)
    
    NAME
           man - an interface to the on-line reference manuals
    
    SYNOPSIS
           man  [-C  file]  [-d]  [-D]  [--warnings[=warnings]]  [-R  encoding]  [-L  locale]  [-m  system[,...]]  [-M  path]  [-S list] [-e extension] [-i|-I]
           [--regex|--wildcard] [--names-only] [-a] [-u] [--no-subpages] [-P pager] [-r prompt] [-7] [-E encoding] [--no-hyphenation] [--no-justification]  [-p
           string] [-t] [-T[device]] [-H[browser]] [-X[dpi]] [-Z] [[section] page ...] ...
           man -k [apropos options] regexp ...
           man -K [-w|-W] [-S list] [-i|-I] [--regex] [section] term ...
           man -f [whatis options] page ...
           man -l [-C file] [-d] [-D] [--warnings[=warnings]] [-R encoding] [-L locale] [-P pager] [-r prompt] [-7] [-E encoding] [-p string] [-t] [-T[device]]
           [-H[browser]] [-X[dpi]] [-Z] file ...
           man -w|-W [-C file] [-d] [-D] page ...
           man -c [-C file] [-d] [-D] page ...
           man [-hV]

    Man“自己的手册帮助页,再比如’man cat’和’man ls’。

    注意:man 帮助页对于命令的学习使用非常有用。


  3. ps命令

    ps命令打印出正在运行的进程的唯一id和PID。

    root@belen:~# ps
    PID TTY          TIME CMD
    4170 pts/1    00:00:00 bash
    9628 pts/1    00:00:00 ps

    使用’-A’参数列出所有拥有Id和PID的进程。

    root@belen:~# ps -A
    
     PID TTY          TIME CMD
        1 ?        00:00:01 init
        2 ?        00:00:00 kthreadd
        3 ?        00:00:01 ksoftirqd/0
        5 ?        00:00:00 kworker/0:0H
        7 ?        00:00:00 kworker/u:0H
        8 ?        00:00:00 migration/0
        9 ?        00:00:00 rcu_bh
    ....

    注意:当你想知道系统中有那些进程正在运行或者你需要PID去结束一个进程时这个命令是非常有用的。你可用把这个命令和’grep’结合使用可以精准输出有用的信息。

    root@belen:~# ps -A | grep -i ssh
    
    1500 ?        00:09:58 sshd
    4317 ?        00:00:00 sshd

    :上面的命令’ps‘是’grep‘命令的管道用于展示出我们需要的信息。


  4. kill命令

    从命令的名称你就会明白这个命令的用途。没错这个命令就是用于杀掉(kill)那些部相关的或者没有相应的进程的。这是一个非常有用的命令。你可又能已经习惯了Windows系统的频繁重启,因为Windows中的大部分进程是不能被杀的,即使杀掉了也需要系统重启才能生效;但这些在Linux中不会出现,在Linux中你可以杀死一个进程而不许要重启系统。

    你需要一个进程的‘pid’(ps)去杀掉这个进程。
    让我们展示如何使用”ps -A“和”grep“命令查询我们想要结束的’apache2’进程,然后kill掉这个进程。

    root@belen:~# ps -A | grep -i apache2
    1285 ?        00:00:00 apache2

    上面的例子找到了’apache2’进程的相关信息,’apache2’进程的pid是’1285’。

    root@belen:~# kill 1285 (to kill the process apache2)

    注意:每次打开或者重启系统每个进程的pid都是不同的,你可以使用’ps’命令查看当前的进程PID。

    另外一种kill进程的方式:

    root@belen:~# pkill apache2

    注意:’kill’命令需要脚本或者进程的id,而’pkill’入上面的例子你可以指定进程的所属进程命。


  1. whereis命令

    “whereis”命令是用于定位二进制,源码和Manual Pages的位置命令。例如:

    root@belen:~# whereis ls 
    ls: /bin/ls /usr/share/man/man1/ls.1.gz
    
    root@belen:~# whereis kill
    kill: /bin/kill /usr/share/man/man2/kill.2.gz /usr/share/man/man1/kill.1.gz

    注意:这个命令对于我们想编译二进制文件时确定位置是非常有用的。


  2. service命令

    service“命令控制者服务的打开(Starting),停止(Stopping),重启(Restarting)。这个命令可使服务在系统不重启的情况下start,restart或者stop。

    在Ubuntu中启动apache2服务

    root@belen:~# service apache2 start
    
    * Starting web server apache2
    apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
    httpd (pid 1285) already running
    [ OK ]

    在Ubuntu中重启apache2服务

    root@belen:~# service apache2 restart
    
    * Restarting web server apache2                                                                                                                          
    apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
    ... waiting .apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName  [ OK ]    

    在Ubuntu中停止apache2服务

    root@belen:~# service apache2 stop
    
     * Stopping web server apache2 
     apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
     ... waiting     

    注意:所有的进程脚本都存在于’/etc/init.d‘中,不同系统路径可能有差异;即,虽然你运行的是”service apache2 start”但实际”/etc/init.d/apache2 start“要执行。


  1. alias命令

    alias“是一个让你为一个较长的命令取别名的shell命令。
    我现在使用别名’l’代替命令’ls -l’命令的5个字符(包括空格)。

    root@belen:~# alias l='ls -l'

    检验’l‘命令是否正常执行。

    root@belen:~# l
    
    total 36 
    drwxr-xr-x 3 tecmint tecmint 4096 May 10 11:14 Binary 
    drwxr-xr-x 3 tecmint tecmint 4096 May 21 11:21 Desktop 
    drwxr-xr-x 2 tecmint tecmint 4096 May 21 15:23 Documents 
    drwxr-xr-x 8 tecmint tecmint 4096 May 20 14:56 Downloads 
    drwxr-xr-x 2 tecmint tecmint 4096 May  7 16:58 Music 
    drwxr-xr-x 2 tecmint tecmint 4096 May 20 16:17 Pictures 
    drwxr-xr-x 2 tecmint tecmint 4096 May  7 16:58 Public 
    drwxr-xr-x 2 tecmint tecmint 4096 May  7 16:58 Templates 
    drwxr-xr-x 2 tecmint tecmint 4096 May  7 16:58 Videos

    删除命令别名’l’使用’unalias‘。

    root@belen:~# unalias l

    检验’l’命令是否正常执行。

    root@belen:~# l
    bash: l: command not found

    你可以使用别名命令找些乐子,也可以为某些重要的命令取些只有你知道的别名。

    alias cd='ls -l' (set alias of ls -l to cd)
    alias su='pwd' (set alias of pwd to su)
    ....
    (You can create your own)
    ....    

    现在如果有人在你的计算机上吃用’cd’命令,那么Ta将为打印出来的列表感到困惑;当使用’su’命令而看到当前目录时依然如此。当然你可以在不用时使用’unalias‘删除这些别名命令。


  1. df命令

    df“命令报告系统硬盘使用情况。改命令对于管理员或用户掌控硬盘使用情况非常的有用。

    root@belen:~# df
    
    Filesystem     1K-blocks    Used Available Use% Mounted on
    /dev/sda1       47929224 7811908  37675948  18% /
    none                   4       0         4   0% /sys/fs/cgroup
    udev             1005916       4   1005912   1% /dev
    tmpfs             202824     816    202008   1% /run
    none                5120       0      5120   0% /run/lock
    none             1014120     628   1013492   1% /run/shm
    none              102400      44    102356   1% /run/user
    /dev/sda5         184307   79852     94727  46% /boot
    /dev/sda7       95989516   61104  91045676   1% /data
    /dev/sda8       91953192   57032  87218528   1% /personal

    更多关于”df”的命令,请查看。


  2. du命令

    估计文件空间使用情况。递归展示文件夹中文件使用磁盘的简要信息。

    root@belen:~# du
    
    8       ./Daily Pics/wp-polls/images/default_gradient
    8       ./Daily Pics/wp-polls/images/default
    32      ./Daily Pics/wp-polls/images
    8       ./Daily Pics/wp-polls/tinymce/plugins/polls/langs
    8       ./Daily Pics/wp-polls/tinymce/plugins/polls/img
    28      ./Daily Pics/wp-polls/tinymce/plugins/polls
    32      ./Daily Pics/wp-polls/tinymce/plugins
    36      ./Daily Pics/wp-polls/tinymce
    580     ./Daily Pics/wp-polls
    1456    ./Daily Pics
    36      ./Plugins/wordpress-author-box
    16180   ./Plugins
    12      ./May Articles 2013/Xtreme Download Manager
    4632    ./May Articles 2013/XCache

    注意:”df”用于报告文件系统的空间使用情况,而”du”主要报告目录内容。更多’du’命令,请查看。


  3. rm命令

    “rm”命令用于删除文件或目录。

    删除目录

    root@belen:~# rm 
    PassportApplicationForm_Main_English_V1.0
    rm: cannot remove 
    `PassportApplicationForm_Main_English_V1.0': Is a directory

    仅仅使用”rm”命令不能删除目录,你需要在”rm”命令后追加”-rf”参数。

    root@belen:~# rm -rf
    PassportApplicationForm_Main_English_V1.0    

    警告:如果你使用”rm -rf“误删除了一个目录那么将是灾难性的。一旦你使用”rm -rf”删除一个目录那么将永久性的删除目录下面的所有文件。请谨慎操作。


  4. echo命令

    echo“顾名思义是纯文本输出命令。它不会操作shell命令,shell也不会读取输出的命令。然而,在一个交互性的脚本中,可以输出相关信息到命令终端。这在互动脚本中是一个非常有用的命令。

    root@belen:~# echo "cooear.com is a very good website" 
    cooear.com is a very good website

    创建一个简单的交互文本

    1.在桌面上创建一个interactive_shell.sh。(注意.sh的扩展是必须的)

    2.复制下面的内容到这个脚本中。

    #!/bin/bash 
    echo "Please enter your name:" 
    read name
    echo "Welcome to Linux $name"

    接下来,给这个脚本可执行权限并运行。

    root@belen:~# chmod 777 interactive_shell.sh
    
    root@belen:~# ./interactive_shell.sh
    Please enter your name:
    Belen
    Welcome to Linux Belen    

    注意:’#!/bin/bash‘告诉shell这是一个脚本程序在shell脚本头部写上这行代码是非常必要的,’read’读取输入的值。


  5. passwd命令

    passwd“是在命令终端修改密码非常有用的命令。很明显为了安全起见你必须知道当前密码。

    root@belen:~# passwd 
    
    Changing password for tecmint. 
    (current) UNIX password: ******** 
    Enter new UNIX password: ********
    Retype new UNIX password: ********
    Password unchanged   [Here was passowrd remians unchanged, i.e., new password=old password]
    Enter new UNIX password: #####
    Retype new UNIX password:#####

  6. lpr命令

    lpr“将档案或是由标准输入送进来的资料送到打印机贮列之中,打印机管理程序 lpd 会在稍后将这个档案送给适当的程序或装置处理。lpr 可以用来将料资送给本地或是远端的主机来处理。

    root@belen:~# lpr -P deskjet-4620-series 1-final.pdf

    注意:”lpq“命令让你查看打印机的状态(是否可用),以及正在等待中的打印任务。


  7. cmp命令

    cmp“比较两个文件的差异。默认情况下如果两个文件相同那么返回0;如果有差异则标示出第一个不同之处的字符和列数编号。

    file1.txt

    root@belen:~# cat file1.txt
    Hi My name is Tecmint

    file2.txt

    root@belen:~# cat file2.txt
    Hi My name is tecmint [dot] com

    现在比较两个文件的输出差异:

    root@belen:~# cmp file1.txt file2.txt 
    file1.txt file2.txt differ: byte 15, line 1

  8. wget命令

    wget“是一个免费的非交互是的下载工具(支持后台下载),可用从web页面下载文件,支持HTTP,HTTPS,FTP协议和HTTP代理。

    使用wget下载ffmpeg

    root@belen:~# wget http://downloads.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2
    
    --2013-05-22 18:54:52--  http://downloads.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2
    Resolving downloads.sourceforge.net (downloads.sourceforge.net)... 216.34.181.59
    Connecting to downloads.sourceforge.net (downloads.sourceforge.net)|216.34.181.59|:80... connected.
    HTTP request sent, awaiting response... 302 Found
    Location: http://kaz.dl.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2 [following]
    --2013-05-22 18:54:54--  http://kaz.dl.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2
    Resolving kaz.dl.sourceforge.net (kaz.dl.sourceforge.net)... 92.46.53.163
    Connecting to kaz.dl.sourceforge.net (kaz.dl.sourceforge.net)|92.46.53.163|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 275557 (269K) [application/octet-stream]
    Saving to: ‘ffmpeg-php-0.6.0.tbz2’
    
    100%[===========================================================================>] 2,75,557    67.8KB/s   in 4.0s   
    
    2013-05-22 18:55:00 (67.8 KB/s) - ‘ffmpeg-php-0.6.0.tbz2’ saved [275557/275557]

  9. mount命令

    mount“用于挂载那些在Linux系统中不能自动挂载的文件系统。使用该命令需要root权限。

    在你插入你的文件系统后,首先运行”lsblk”查看你的设备名称并记下他们的名称。

    root@belen:~# lsblk 
    
    NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT 
    sda      8:0    0 931.5G  0 disk 
    ├─sda1   8:1    0 923.6G  0 part / 
    ├─sda2   8:2    0     1K  0 part 
    └─sda5   8:5    0   7.9G  0 part [SWAP] 
    sr0     11:0    1  1024M  0 rom  
    sdb      8:16   1   3.7G  0 disk 
    └─sdb1   8:17   1   3.7G  0 part

    从上面的代码可以清楚的看出我插入了一个4G的设备,因此’sdb1’是我要挂载的文件系统。切换到root用户将该设备挂载到常用的挂载目录’/dev’。

    root@belen:~# su
    Password:    

    root@belen:~# cd /dev

    创建一个和挂载设备相关的目录名(便于以后查看)。

    root@belen:~# mkdir usb

    现在将文件系统’sdb1’挂载到目录’usb’。

    root@belen:~# mount /dev/sdb1 /dev/usb

    现在你可以从终端或者X-windows系统通过/dev/usb目录访问被挂载的目录了。


  1. gcc命令

    gcc“用于在Linux系统中编译’C’语言的程序。一个简单的’C’语言程序我们将它保存在桌面上命名为Hello.c(切记’.c’的扩展是必须的)。

    #include 
    int main()
    {
      printf("Hello world\n");
      return 0;
    }

    编译c程序

    root@belen:~# gcc Hello.c

    运行c程序

    root@belen:~# ./a.out 
    Hello world    

    注意:上面的c程序在编译时会自动生成一个新文件”a.out”,而你每次编译c程序都会生成一个同名的’a.out’覆盖前面的文件,因此在编译时指定一个输出文件是十分必要的。

    编译输出到指定文件

    root@belen:~# gcc -o Hello Hello.c

    这里’-o’让编译后生成’Hello’而非’a.out’文件。运行:

    root@belen:~# ./Hello 
    Hello world

  2. g++命令

    g++“用于编译”C++”第一个面向对象的编程语言。创建一个简单的c++程序,并在桌面上保存为Add.cpp(切记’.cpp’扩展是必须的)。

    #include 
    
    using namespace std;
    
    int main() 
        {
              int a;
              int b;
              cout<<"Enter first number:\n";
              cin >> a;
              cout <<"Enter the second number:\n";
              cin>> b;
              cin.ignore();
              int result = a + b;
              cout<<"Result is"<<"  "<
         }     

    编译:

    root@belen:~# g++ Add.cpp

    运行:

    root@belen:~# ./a.out
    
    Enter first number: 
    ...
    ...

    注意:上面的c++程序在编译时会自动生成一个新文件”a.out”,而你每次编译c++程序都会生成一个同名的’a.out’覆盖前面的文件,因此在编译时指定一个输出文件是十分必要的。

    编译到指定文件:

    root@belen:~# g++ -o Add Add.cpp

    运行:

    root@belen:~# ./Add 
    
    Enter first number: 
    ...
    ...        

  3. java命令

    Java是一个世界上广泛使用的编程语言而且快速,安全,可靠。当今的很多web服务都是基于java开发的。

    创建一个名字为belen.java的java程序(切记’.java’扩展是必须的)。

    class belen {
      public static void main(String[] arguments) {
        System.out.println("Tecmint ");
      }
    }

    使用javac编译:

    root@belen:~# javac belen.java

    运行:

    root@belen:~# java belen

    注意:几乎所欲的分支都包含路gcc编译器,大部分是g++编译器,当然有些是没有的。你可以使用apt或者yum命令安装某些必须的软件包。