大家都知道,Linux系统提供了非常多非常多的命令或工具,这些命令都各有所长,都是系统需要的。但我们精力有限,要掌握全部的命令不太现实,所以只需要掌握其中部分常用的命令即可。这里,我就从一个Java程序员的角度,总结出我常用的一些Linxu命令,供大家参考。

文件目录基本操作
ls 命令用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。
常用选项:ls(选项)(参数)
-a 显示所有档案及目录(ls默认不会列出隐藏文件);
-l 所有输出信息用单列格式输出,不输出为多列;
--color[=WHEN]:使用不同的颜色高亮显示不同类型的。实际应用时,我经常会使用ls -l --color=auto,并给它指定一个别名ll:alias ll='ls -l --color=auto'效果如图1:

 

图1

cd 用来切换工作目录至dirname。 其中dirname表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的home directory。
常用选项:cd   进入用户主目录
cd ~ 进入用户主目录
cd - 返回进入此目录之前所在的目录
cd .. 返回上级目录(若当前目录为“/“,则执行完后还在“/";".."为上级目录的意思)
cd ../.. 返回上两级目录
cd !$ 把上个命令的参数作为cd参数使用
mkdir 创建目录。该命令创建由dirname命名的目录。如果在目录名的前面没有加任何路径名,则在当前目录下创建由dirname指定的目录;如果给出了一个已经存在的路径,将会在该目录下创建一个指定的目录。
常用选项:-p 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录
rm 删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉。对于链接文件,只是删除整个链接文件,而原有文件保持不变。
常用选项:-f:强制删除文件或目录
-i:删除已有文件或目录之前先询问用户
-r或-R:递归处理,将指定目录下的所有文件与子目录一并处理注意:使用rm命令要格外小心。因为一旦删除了一个文件,就无法再恢复它。
cp 将一个或多个源文件或者目录复制到指定的目的文件或目录。
常用选项:-f:强行复制文件或目录,不论目标文件或目录是否已存在
-i:覆盖既有文件之前先询问用户
-R/r:递归处理,将指定目录下的所有文件与子目录一并处理示例:cp /home/sre/tom.log .   将文件/home/sre/tom.log复制到当前目录
cp -r katarina  /home/sre/logs/ 将目录katarina复制到/home/sre/logs/目录下
mv 对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。source表示源文件或目录,target表示目标文件或目录。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。
常用选项:-f:若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录
-u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作示例:mv katarina/* logs/ 将目录katarina下所有文件复制到目录logs下
pwd 以绝对路径的方式显示用户当前工作目录
如图2:

 

图2

tree 以树状图列出目录的内容
如图3

 

图3

touch 两个功能:一是创建新的空文件;二是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来。
示例:touch /var/wd/logs/touch.txt 创建空文件/var/wd/logs/touch.txt
chmod 变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。
示例:chmod +x what_cpu_do.sh 给脚本what_cpu_do.sh增加可执行权限
chmod u+x,g+w test  //为文件test设置自己可以执行,组员可以写入的权限
file 探测给定文件的类型。
示例:[sre@CDVM-213017031 ~]$ file what_cpu_do.sh
what_cpu_do.sh: Bourne-Again shell script text executable
[sre@CDVM-213017031 ~]$ file logs
logs: directory
[sre@CDVM-213017031 ~]$ file network_last.log
network_last.log: empty
[sre@CDVM-213017031 ~]$ file fix
fix: directory
文件内容查看

cat 连接文件并打印到标准输出设备上,cat经常用来显示文件的内容。
示例:[sre@CDVM-213017031 ~]$ cat flow_of_network.sh | grep "RX_next"
RX_next=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $2}')
RX=$((${RX_next}-${RX_pre}))
grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
常用选项:-A<显示列数> (After)除了显示符合范本样式的那一行之外,并显示该行之后的内容
-B (Before)在显示符合范本样式的那一行之外,并显示该行之前的内容
-C<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容
-i 忽略字符大小写。示例:
[sre@CDVM-213017031 ~]$ cat what_cpu_do.sh | grep "process of" -A 5 -B 5 (等效于 cat what_cpu_do.sh | grep "jstack" -C 5 )
 echo "checking pid($pid)"
fi

if test -z "$(jps -l | cut -d '' -f 1 | grep $pid)"
then
 echo "process of $pid is not exists"
 exit
fi

lineNum=$2
if test -z $lineNumtail 输出文件中的尾部内容,默认在屏幕上显示指定文件的末尾10行。
常用选项:-f:显示文件最新追加的内容(查看服务器上动态刷新的日志时经常使用)。
-n:输出文件的尾部N(N位数字)行内容示例:tail -100f /var/wd/logs/owl/owl.20170508.log 显示文件/var/wd/logs/owl/owl.20170508.log中的后100行,并且当文件有更新显示最新的内容。
head 显示文件的开头的内容。在默认情况下,head命令显示文件的头10行内容。
常用选项:-n<数字>:指定显示头部内容的行数
-c<字符数>:指定显示头部内容的字符数
-v:总是显示文件名的头信息
-q:不显示文件名的头信息
more 一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作。more名单中内置了若干快捷键,常用的有H(获得帮助信息),Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)。
常用选项:Space键:显示文本的下一屏内容
Enter键:只显示文本的下一行内容
斜线符/:接着输入一个模式,可以在文本中寻找下一个相匹配的模式
h键:显示帮助屏,该屏上有相关的帮助信息
b键:显示上一屏内容
q键:退出rnore命令

less 与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。要退出less程序,应按q键。


wc 用来计算数字。利用wc指令我们可以计算文件的Byte数、字数或是列数。
常用选项:
-c:只显示Bytes数
-l:只显示列数
-w:只显示字数
tr 对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。
常用选项:-c:取代所有不属于第一字符集的字符
-d:删除所有属于第一字符集的字符
-s:把连续重复的字符以单独一个字符表示示例:echo "HELLO WORLD" | tr 'A-Z' 'a-z' hello world  将输入字符由大写转换为小写
hello world
echo "hello 123 world 456" | tr -d '0-9' hello world 使用tr删除字符
hello world
sort 将文件进行排序,并将排序结果标准输出。它可以从特定的文件,也可以从stdin中获取输入。
常用选项:-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符
-f:排序时,将小写字母视为大写字母
-k:  来指定列数
-r:以相反的顺序来排序来自示例:[sre@CDVM-213017031 ~]$ ps -mp 25211 -o THREAD,tid,time | sort -r -k 2
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
sre       8.8   -    - -         -      -     - 4-04:00:56
sre       5.4  19    - futex_    -      - 25485 2-13:59:26
sre       0.8  19    - futex_    -      - 16755 00:00:24
sre       0.1  19    - ep_pol    -      - 25663 01:31:00
sre       0.1  19    - ep_pol    -      - 25487 01:38:57
sre       0.1  19    - ep_pol    -      - 25486 01:38:52
sre       0.0  19    - skb_re    -      - 24586 00:00:00
sre       0.0  19    - poll_s    -      - 25678 00:44:56
sre       0.0  19    - poll_s    -      - 25676 00:00:00
sre       0.0  19    - poll_s    -      - 25213 00:00:01
sre       0.0  19    - futex_    -      -  7679 00:00:00
sre       0.0  19    - futex_    -      -  5952 00:00:00上述命令功能:查看进程(pid为25211)占用CPU资源最多的线程信息(根据CPU占用率倒序排列)。

文件查找与比较

find 在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
示例:
find /home -name "*.txt"  在/home目录下查找以.txt结尾的文件名
find /home -iname "*.txt" 同上,但忽略大小写
find /home ! -name "*.txt"  找出/home下不是以.txt结尾的文件

which 查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量$PATH设置的目录里查找符合条件的文件。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
示例:
[sre@CDVM-213017031 ~]$ which java
/usr/java/default/bin/java
[sre@CDVM-213017031 ~]$ which pwd
/bin/pwd
[sre@CDVM-213017031 ~]$ which python
/usr/bin/python
whereis 用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。
和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。
示例:[sre@CDVM-213017031 ~]$ whereis python
python: /usr/bin/python /usr/bin/python2.6 /usr/lib/python2.6 /usr/lib64/python2.6 /usr/include/python2.6 /usr/share/man/man1/python.1.gz
[sre@CDVM-213017031 ~]$ whereis lua
lua: /usr/bin/lua /usr/lib64/lua /usr/share/lua /usr/share/man/man1/lua.1.gz
[sre@CDVM-213017031 ~]$ whereis java
java: /usr/bin/java
locate locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且自动更新,由于更新非实时,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
示例:locate /etc/sh  搜索etc目录下所有以sh开头的文件
locate -i ~/m 搜索用户主目录下,所有以m开头的文件,并且忽略大小写

文件压缩与解压
tar tar命令可以为linux的文件和目录创建档案。
常用选项:-c:建立新的备份文件
-z:通过gzip指令处理备份文件
-v:显示指令执行过程
-f:指定备份文件
-x:从备份文件中还原文件示例:tar -cvf log.tar log2012.log 仅打包,不压缩!
tar -zcvf log.tar.gz log2012.log 打包后,以 gzip 压缩
tar -jcvf log.tar.bz2 log2012.log 打包后,以 bzip2 压缩

zip 可以用来解压缩文件,或者对文件进行打包操作。


unzip 加压缩.zip包,不在详述。
另外,关于压缩、解压缩命令还有gzip、gunzip、bzip2、bunzip2等,读者如果感兴趣,可自行搜索了解。


进程管理
ps 用于报告当前系统的进程状态,是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。
由于ps命令能够支持的系统类型相当的多,所以选项多的离谱!我主要使用:[sre@CDVM-213017031 ~]$ ps aux | grep "sudo"
sre       9524  0.0  0.0 103252   832 pts/1    S+   16:16   0:00 grep sudo
root     19503  0.0  0.0 189992  2996 pts/1    S    13:37   0:00 sudo su - sre
root     22710  0.0  0.0 189992  3000 pts/0    S    11:42   0:00 sudo su - sre以及上文提到的:ps -mp 25211 -o THREAD,tid,time | sort -r -k 2

kill 命令用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。
常用选项:
kill -9 强制终止进程
kill -15 正常终止进程
具有相似功能的命令,还有killall、pkill等。


watch 以周期性的方式执行给定的指令,指令输出以全屏方式显示。
常用选项:
-n:指定指令执行的间隔时间(秒)
-d:高亮显示指令输出信息不同之处
-t:不显示标题。
示例:

watch ss
Every 2.0s: ssMon May  8 16:23:58 2017

State       Recv-Q Send-Q      Local Address:Port          Peer Address:Port
ESTAB       0      0         ::ffff:10.213.17.31:45473       ::ffff:10.213.18.49:10994
ESTAB       0      0         ::ffff:10.213.17.31:30046     ::ffff:10.209.19.143:10117
ESTAB       0      0         ::ffff:10.213.17.31:11233     ::ffff:10.209.26.154:10118
ESTAB       0      0         ::ffff:10.213.17.31:55524       ::ffff:10.209.33.69:eforward
ESTAB       0      0         ::ffff:10.213.17.31:56865       ::ffff:10.209.18.34:10218
ESTAB       0      0         ::ffff:10.213.17.31:25608     ::ffff:10.209.19.144:10117
ESTAB       0      0         ::ffff:10.213.17.31:19649       ::ffff:10.209.18.64:10620service service命令是Redhat Linux兼容的发行版中用来控制系统服务的实用工具,它以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。
服务名:自动要控制的服务名,即/etc/init.d目录下的脚本文件名
示例:service mysqld status
mysqld (pid 1638) 正在运行...
service mysqld restart
停止 MySQL: [ 确定 ]
启动 MySQL: [ 确定 ]
网络操作

curl  curl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。
wget wget命令用来从指定的URL下载文件。
示例:wget http://www.yourserverip.net/testfile.zip 下载文件
ping 用来测试主机之间网络的连通性。[sre@CDVM-213017031 ~]$ ping www.wanda.cn
PING www.wanda.cn (10.199.8.10) 56(84) bytes of data.
64 bytes from 10.199.8.10: icmp_seq=1 ttl=244 time=50.8 ms
64 bytes from 10.199.8.10: icmp_seq=2 ttl=244 time=51.8 ms
64 bytes from 10.199.8.10: icmp_seq=3 ttl=244 time=51.0 ms
64 bytes from 10.199.8.10: icmp_seq=4 ttl=244 time=53.3 ms
telnet用于登录远程主机,对远程主机进行管理。我常用它来检测端口。
示例:[sre@CDVM-213017031 ~]$ telnet 10.213.17.32 10000
Trying 10.213.17.32...
telnet: connect to address 10.213.17.32: Connection refused
[sre@CDVM-213017031 ~]$ telnet 10.213.17.32 10062
Trying 10.213.17.32...
Connected to 10.213.17.32.
Escape character is '^]'.
^C
Connection closed by foreign host.
nslookup 常用域名查询工具,就是查DNS信息用的命令。
示例:
[sre@CDVM-213017031 ~]$ nslookup www.baidu.com
Server:        10.209.11.13
Address:    10.209.11.13#53

Non-authoritative answer:
www.baidu.com    canonical name = www.a.shifen.com.
Name:    www.a.shifen.com
Address: 111.206.223.205
Name:    www.a.shifen.com
Address: 111.206.223.206ss 用来显示处于活动状态的套接字信息。ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。
常用选项:-n:不解析服务名称,以数字方式显示
-a:显示所有的套接字
-l:显示处于监听状态的套接字
-m:显示套接字的内存使用情况
-p:显示使用套接字的进程信息
-i:显示内部的TCP信息;
-t:只显示tcp套接字
-u:只显示udp套接字示例:[sre@CDVM-213017031 ~]$ ss -t
State