作为Java开发人员,要掌握常用的Linux命令。
为什么要写此文,笔者的Linux很厉害?NoNoNo,正因为笔者不熟悉Linux才写此文,以作整理。
最主要的命令
查询命令的简要用法,help
当你不懂一个命令的作用时,可以在该命令后加--help
或简写-h
查看该命令的用法,比如查询ls
的用法:
[root@localhost ~]# ls --help
查询命令的详细用法,man
man
是manual
,手册的意思,由于手册比较详细,会有翻页等交互,操作与less
一致。
比如查询man
命令的手册:
[root@localhost ~]# man man
常用选项
-
-h
,也可用--human-readable
,人类可读的意思 -
-f
,也可用--force
,强制的意思 -
-n
,行数的意思,line number
-
-c
,创建的意思,create
-
-x
,也可用--extract
,解压的意思 -
-f
,也可用--file=ARCHIVE
,指定归档文件的意思 -
-r
,也可用--recursive
,递归、循环的意思 -
-d
,也可用--decompress
,解压的意思 -
-v
,也可用--verbose
,详细的、啰嗦的意思
文件相关命令
列出目录内容,ls
ls
,list directory contents
,列出目录内容。
[user001@localhost ~]$ ls
1.log Desktop Documents Downloads Music Pictures Public Templates Videos
另外,ls -l
的别名ll
也挺好用,因为ll
输入起来很方便:
[user001@localhost ~]$ ll
total 36
-rw-rw-r--. 1 user001 user001 25 Mar 23 07:23 1.log
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Desktop
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Documents
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Downloads
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Music
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Pictures
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Public
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Templates
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Videos
文本编辑,vi
vi
,全名为vi IMproved
,是很好用的文本编辑器。
-
Esc
,退出编辑模式
到命令模式
-
i
,在光标前以插入形式
进入编辑模式
,进入此模式后在屏幕的左下角可看到-- INSERT --
-
a
,在光标后以插入形式
进入编辑模式
,进入此模式后在屏幕的左下角可看到-- INSERT --
-
x
,删除单字符,为什么是x
,我的理解是叉的意思 - 连续的按键位置
h
、j
、k
、l
分别代表←
、↓
、↑
、→
-
j
是右手食指的按键,是最常用的按键,自然是代表↓
-
k
用无名指按的,代表↑
-
h
在最左边,自然代表←
-
l
在最右边,自然代表→
-
1yy
,复制当前光标下的1行,如果复制两行,就是2yy
。但是,我不知道为什么yy
代表复制 -
p
,粘贴,paste
-
dd
,删除一行,delete
-
:wq
,保存并退出,write & quit
-
:q!
,不保存退出
查看文档,less
查看文档。
-
f
,向下翻一页文档,forward
的意思 -
b
,向上翻一页文档,back
的意思 -
G
,滚动到文档的最后,这在查看日志时很常用 -
F
,滚动到文档的最后并定时刷新,这在查看日志时很常用 -
/xxx
,查找xxx的文档位置,按n
定位到下一个匹配项,N
定位到上一个匹配项
创建目录,mkdir
mkdir
,意为创建目录,make directories
。
[root@localhost ~]# mkdir hello_pkg
[root@localhost ~]#
[root@localhost ~]# ll
total 72
-rw-------. 1 root root 2695 Nov 29 15:36 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 Mar 26 21:07 hello_pkg
创建文件,touch
touch
,修改文件时间,或创建文件。以下是例子:
[root@localhost hello_pkg]# ll
total 0
-rw-r--r--. 1 root root 0 Mar 26 21:11 hello_world.txt
[root@localhost hello_pkg]#
[root@localhost hello_pkg]# touch hello_world.txt
[root@localhost hello_pkg]#
[root@localhost hello_pkg]# ll
total 0
-rw-r--r--. 1 root root 0 Mar 26 21:12 hello_world.txt
[root@localhost hello_pkg]# touch hello_new_world.txt
[root@localhost hello_pkg]# ll
total 0
-rw-r--r--. 1 root root 0 Mar 26 21:13 hello_new_world.txt
-rw-r--r--. 1 root root 0 Mar 26 21:12 hello_world.txt
按文件名查找文件
在/目录下查找名称为xxx-data的文件:
find / -name xxx-data
查找文件内匹配的关键字
查找/top.log包含关键字Mem的行:
# grep 'Mem' /top.log
Mem: 1922148k total, 1783468k used, 138680k free, 180284k buffers
省略注释行和空行的方式查看配置文件
[root@blog ~]# grep -v "^#" xxx.conf | grep -v "^$"
删除文件或文件夹,rm
rm,删除文件或文件夹,remove files or directories
。
这是删除一个文件,默认会询问确认是否删除:
[root@localhost hello_pkg]# rm hello_world.txt
rm: remove regular empty file `hello_world.txt'? y
这是删除目录,默认依然会询问确认,当然你可以通过强制命令取消询问,这里不介绍:
[root@localhost ~]# rm hello_pkg/
rm: cannot remove `hello_pkg/': Is a directory
[root@localhost ~]#
[root@localhost ~]# rm -r hello_pkg/
rm: descend into directory `hello_pkg'? y
rm: remove regular empty file `hello_pkg/hello_new_world.txt'? y
rm: remove directory `hello_pkg'? y
移动文件,mv
mv
,移动文件,move
的意思。
[root@localhost hello_package]# mv hello_world ../
[root@localhost hello_package]# ll ../
total 72
-rw-------. 1 root root 2695 Nov 29 15:36 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 Mar 26 21:21 hello_package
-rw-r--r--. 1 root root 0 Mar 26 21:21 hello_world
拷贝文件,cp
cp
,拷贝文件,copy
的意思。
[root@localhost ~]# cp hello_world ./hello_package/
[root@localhost ~]# ll hello_package/
total 0
-rw-r--r--. 1 root root 0 Mar 26 21:23 hello_world
排序,sort
对文件排序并输入。
echo -e "3\n2\n1" > 123.txt
sort 123.txt
1
2
3
排除重复,uniq
echo -e "3\n2\n2\n1" > 123.txt
uniq 123.txt
3
2
1
实践
nginx的access.log是一个Web的访问日志,用它来练习非常不错,他的内容是这样的:
127.0.0.1 - - [07/Jul/2018:12:34:53 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "curl/7.29.0"
192.168.1.1 - - [07/Jul/2018:12:50:05 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:12:50:32 +0800] "GET /index.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:12:52:21 +0800] "GET /index-nick.html HTTP/1.1" 200 612 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:12:52:34 +0800] "GET /index.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:12:54:21 +0800] "GET /index-nick.html HTTP/1.1" 200 612 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:12:56:03 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:20:32:56 +0800] "GET /index.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:20:33:02 +0800] "GET /index-nick.html HTTP/1.1" 200 612 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:20:34:58 +0800] "GET /index.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:20:35:03 +0800] "GET /index-nick.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:20:40:10 +0800] "GET /index.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:20:40:16 +0800] "GET /index-nick.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
提取所有请求URL并排序排重
awk '{print $7}' /usr/local/nginx/logs/access.log | sort | uniq
归档文件命令
文件打包归档,tar
tar
,将文件打包归档,或将存档文件打开。为什么叫tar
?我的理解是together archive
。
[root@localhost hello_package]# tar -cf txt.tar 1.txt 2.txt
[root@localhost hello_package]# ll
total 12
-rw-r--r--. 1 root root 0 Mar 26 22:29 1.txt
-rw-r--r--. 1 root root 0 Mar 26 22:29 2.txt
-rw-r--r--. 1 root root 10240 Mar 26 22:30 txt.tar
[root@localhost hello_package]# ll
total 12
-rw-r--r--. 1 root root 10240 Mar 26 22:30 txt.tar
[root@localhost hello_package]# tar -xf txt.tar
[root@localhost hello_package]# ll
total 12
-rw-r--r--. 1 root root 0 Mar 26 22:29 1.txt
-rw-r--r--. 1 root root 0 Mar 26 22:29 2.txt
-rw-r--r--. 1 root root 10240 Mar 26 22:30 txt.tar
gz文件的解压及压缩,gzip
gunzip
解压文件:
[root@localhost third_pkg]# gzip -d apache-tomcat-8.5.12.tar.gz
[root@localhost third_pkg]# ll
total 13452
-rw-r--r--. 1 root root 13772800 Mar 14 19:55 apache-tomcat-8.5.12.tar
gunzip
压缩文件:
[root@localhost third_pkg]# gzip -c apache-tomcat-8.5.12.tar > apache-tomcat-8.5.12.tar.gz
xz文件的解压和压缩,xz
解压:
[root@localhost third_pkg]# xz -d rabbitmq-server-generic-unix-3.6.8.tar.xz
压缩:
[root@localhost third_pkg]# xz -k rabbitmq-server-generic-unix-3.6.8.tar
bz2的解压与压缩,bzip2
解压:
[root@localhost third_pkg]# bzip2 -d 123.tar.bz2
压缩:
[root@localhost third_pkg]# bzip2 -c 123.tar > 123.tar.bz2
系统状态的命令
查看网卡的信息,ifconfig
ifconfig
,是network interfaces configuring
,查询服务器的网卡情况:
[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:72:9D:E7
inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe72:9de7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4806 errors:0 dropped:0 overruns:0 frame:0
TX packets:826 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:387034 (377.9 KiB) TX bytes:138929 (135.6 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:448 (448.0 b) TX bytes:448 (448.0 b)
查看磁盘使用情况,df
df
是disk file system
的简写,用于查看磁盘的使用情况。常搭配-h
使用,-h
是--human-readable
的意思。
[user001@localhost ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 77G 3.3G 70G 5% /
tmpfs 495M 216K 495M 1% /dev/shm
/dev/sda1 291M 34M 242M 13% /boot
查看目录大小
查看当前目录的大小:du -sh
查看当前目录下各一级子目录的大小:du -lh --max-depth=1
[root@blog third_package]# du -sh
507M .
[root@blog third_package]#
[root@blog third_package]# du -lh --max-depth=1
62M ./redis-3.2.1
232K ./.deps
23M ./nginx-1.8.0
6.8M ./.libs
507M .
查看进程的信息,ps
ps
是process snapshot
的意思,进程快照,通过此命令可以查看进程的信息,常用的用法:
[user001@localhost ~]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Mar22 ? 00:00:01 /sbin/init
root 2 0 0 Mar22 ? 00:00:00 [kthreadd]
root 3 2 0 Mar22 ? 00:00:00 [migration/0]
查看内存使用情况,free
用free
查看内存使用情况:
[user001@localhost ~]$ free
total used free shared buffers cached
Mem: 1012352 537764 474588 0 72292 253348
-/+ buffers/cache: 212124 800228
Swap: 2031608 0 2031608
其中Swap
是交换区
,类似于Windows的虚拟内存
,在内存不够时,把硬盘空间当成内存使用。
虚拟内存统计报告,vmstat
vmstat
,是virtual memory statistics
,意思为虚拟内存统计。
[user001@localhost ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 473968 72644 253364 0 0 8 4 25 35 0 0 99 0 0
查看网络情况,netstat
[user001@localhost ~]$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.1.101:ssh 192.168.1.100:63840 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 9155 @/org/kernel/udev/udevd
unix 2 [ ] DGRAM 12811 @/org/freedesktop/hal/udev_event
unix 16 [ ] DGRAM 12243 /dev/log
查看IO的情况,iostat
[user001@localhost ~]$ iostat
Linux 2.6.32-431.el6.x86_64 (localhost.localdomain) 03/23/2017 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.05 0.00 0.29 0.24 0.00 99.41
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.78 16.18 8.62 611952 325794
网络命令
下载文件,wget
wget
,从网络上下载文件.The non-interactive network downloader.
[root@localhost third_pkg]# wget http://apache.fayea.com/tomcat/tomcat-8/v8.5.12/bin/apache-tomcat-8.5.12.tar.gz
截取网络传输的数据包,tcpdump
指定eth0网卡且端口为443的数据包:
tcpdump -i eth0 port 443
指定eth0网卡且端口为443且IP为xx.xx.xx.xx的数据包:
tcpdump -i eth0 '(port 443 && host xx.xx.xx.xx)'
将截取的数据包保存为cap
文件,在Windows下可用Wireshark
分析:
tcpdump -i eth0 -w /tmp/mytcpdump-20170907.cap
安装软件
查询是否安装RPM包
[root@blog third_package]# rpm -qa | grep rabbitmq
安装RPM包
[root@blog third_package]# rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
等于
[root@blog third_package]# rpm --install --verbose --hash rabbitmq-server-3.6.5-1.noarch.rpm
卸载软件
[root@blog third_package]# rpm -e erlang-common_test-R14B-04.3.el6.x86_64
卸载多版本
[root@blog third_package]# rpm -e --allmatches xxx
yum查询安装包
[root@blog third_package]# yum list | grep erlang
yum安装软件
[root@blog third_package]# yum install xxx
yum卸载软件
[root@blog third_package]# yum remove erlang
定时任务
查看当前用户的定时任务:crontab -l
编辑当前用户的定时任务:crontab -e
,其会进入vi
编辑具体任务,其对应的是/var/spool/cron/
下的文件,比如root
用户,就是/var/spool/cron/root
。
系统的定时任务可以配置到/etc/crontab
,另外,此文件也有定时任务时间格式的简单描述。
其它
服务器时间同步
[root@blog ~]# sudo yum install ntp
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
Package ntp-4.2.6p5-10.el6.centos.2.x86_64 already installed and latest version
Nothing to do
[root@blog ~]# sudo ntpdate time.nist.gov
26 Jun 18:00:24 ntpdate[1215]: the NTP socket is in use, exiting
一些符号的用法
前面命令的输出作为后面命令的输入,|
|
,前面命令的输出作为后面命令的输入,比如查看进程并筛选包含java的行:
[user001@localhost ~]$ ps -ef | grep java
user001 7729 7601 0 06:29 pts/0 00:00:00 grep java
重定向,>
>
重定向,如果文件不存在,则创建文件;如果已存在,则覆盖。
[user001@localhost ~]$ echo 'user101' > 1.log
追加,>>
>>
,将内容追加到文件末尾。如果文件不存在,则创建文件;如果已存在,则将内容追加在文件末尾。
[user001@localhost ~]$ echo 'user002' >> 1.log
单引号与双引号,"、""
单引号忽略所有特殊字符,双引号只忽略部分特殊字符,不忽略$、*等等等。而表达一个字符串,除了单引号与双引号,还有不加任何引号的形式,如果是不含空格的连续字符串,在命令中可以直接使用,否则可以用双引号或单引号括起来。
在命令中使用字符串,可以遵循以上规则。
在less命令阅读的文档中查找某关键字,直接使用包含空格的字符串即可。
[root@localhost ~]# echo '$PATH'
$PATH
[root@localhost ~]# echo "$PATH"
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/rabbitmq_server-3.6.6/sbin:/usr/local/erlang/bin
执行多条命令的连接符,"&&"
[root@blog /]# echo 'hello ' && echo 'world'
hello
world
脚本
强制删除关键字有关的进程
#/bin/bash
ps -ef | grep $1 | cut -c 9-15 | xargs kill -9