20 个比较高级的 Linux 命令
也许你已经发现了前面关于Linux初级用户(刚接触Linux的用户)的20个命令非常有用。前面的那篇文章是为初学者准备,而这篇则是为有一定基础的中级用户准备。通过这篇文章你将了解到如何去自定义搜索,如何了解正在运行的进程并kill这些进程,另外就是了解Linux命令行的重要以及如何在类unix系统中编译C,C++,java程序。
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**相关命令,请查看。
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)
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 帮助页对于命令的学习使用非常有用。
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‘命令的管道用于展示出我们需要的信息。
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’入上面的例子你可以指定进程的所属进程命。
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
注意:这个命令对于我们想编译二进制文件时确定位置是非常有用的。
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“要执行。
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‘删除这些别名命令。
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”的命令,请查看。
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’命令,请查看。
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”删除一个目录那么将永久性的删除目录下面的所有文件。请谨慎操作。
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’读取输入的值。
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:#####
lpr命令
“lpr“将档案或是由标准输入送进来的资料送到打印机贮列之中,打印机管理程序 lpd 会在稍后将这个档案送给适当的程序或装置处理。lpr 可以用来将料资送给本地或是远端的主机来处理。
root@belen:~# lpr -P deskjet-4620-series 1-final.pdf
注意:”lpq“命令让你查看打印机的状态(是否可用),以及正在等待中的打印任务。
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
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]
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:~# cd /devroot@belen:~# su Password:
创建一个和挂载设备相关的目录名(便于以后查看)。
root@belen:~# mkdir usb
现在将文件系统’sdb1’挂载到目录’usb’。
root@belen:~# mount /dev/sdb1 /dev/usb
现在你可以从终端或者X-windows系统通过/dev/usb目录访问被挂载的目录了。
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
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: ... ...
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命令安装某些必须的软件包。